美文网首页程序员iOS Developer
RxSwift - Transforming Operators

RxSwift - Transforming Operators

作者: 冰三尺 | 来源:发表于2017-08-15 15:23 被阅读51次

    Transforming elements

    1.把单个元素的可观察值转化成一个数组, 并将包含该数组的.next事件发送给订阅者。

    屏幕快照 2017-08-15 下午2.15.27.png
        let disposeBag = DisposeBag()
        Observable.of("A", "B", "C")
            // 把单个元素转化成数组
            .toArray()
            .subscribe(onNext: {
                print($0)
            })
            .addDisposableTo(disposeBag)
    

    打印["A", "B", "C"]

    1. map操作符和Swift中的map是相似的, 会把集合里的元素一次取出来
    屏幕快照 2017-08-15 下午2.22.02.png
        let disposeBag = DisposeBag()
        let formatter = NumberFormatter()
        formatter.numberStyle = .spellOut
        Observable<NSNumber>.of(123, 4, 56)
            .map {
                formatter.string(from: $0) ?? ""
            }
            .subscribe(onNext: {
                print($0)
            })
            .addDisposableTo(disposeBag)
    
    1. mapWithIndex 操作符与takeWhile很相似, takeWhile是返回了true或false, 而mapWithIndex 在返回真假的同时还能进行传进来的值得操作, 下图中mapWithIndex的索引大于1,将通过将元素乘以2来转换元素,否则它将按原样传递元素,因此只有第3个元素被转换。


      屏幕快照 2017-08-15 下午2.28.35.png
        let disposeBag = DisposeBag()
        Observable.of(1, 2, 3, 4, 5, 6)
            // 索引大于2才能被通过进行转化, 否则原样返回
            .mapWithIndex { integer, index in
                index > 2 ? integer * 2 : integer
            }
            .subscribe(onNext: {
                print($0)
            })
            .addDisposableTo(disposeBag)
    

    Transforming inner observables

    flatMap

    FlatMap的作用是把一个可观察的对象转化成另外一个可观察的对象, 磁力中就是把可观察结构体student的score转化成另外一个可观察对象

    struct Student {
        var score: Variable<Int>
        var name: Variable<String>
    }
    
    
    example(of: "flatMap") {
        let disposeBag = DisposeBag()
        
        let ryan = Student(score: Variable(80), name:Variable("A"))
        let charlotte = Student(score: Variable(90), name:Variable("B"))
        
        let student = PublishSubject<Student>()
        student.asObservable()
            .flatMap {
                //flatMap, 是把发射对象转成另外一个Observable,进而把这个Observable发射的对象发射出去
                //如果把此处的score改为name, 则不会打印分数, 只会打印A,B
                $0.score.asObservable()
            }
            .subscribe(onNext: {
                print("\($0) --")
            })
            .addDisposableTo(disposeBag)
        
        student.onNext(ryan)
        ryan.score.value = 85
        student.onNext(charlotte)
        ryan.score.value = 95
        charlotte.score.value = 100
    }
    
    flatMapLatest

    flatMapLatest和flatMap类似, 但是flatMapLatest会自动转化观察者, 当对A进行观察时, 关于A的一些修改, 会被接收到, 但是如果要观察的对象改为B, 则会放弃对A的观察, 而不是A和B都会被观察到.

    example(of: "flatMapLatest") {
        let disposeBag = DisposeBag()
        let ryan = Student(score: Variable(80))
        let charlotte = Student(score: Variable(90))
        let student = PublishSubject<Student>()
        student.asObservable()
            .flatMapLatest {
                $0.score.asObservable()
            }
            .subscribe(onNext: {
                print($0)
            })
            .addDisposableTo(disposeBag)
        student.onNext(ryan)
        ryan.score.value = 85
        // 此处转化成对charlotte的观察, 被观察的对象则会自动移动到charlotte, 而不再观察ryan
        student.onNext(charlotte)
        // 再次对ryan的值进行修改则不会观察到
        ryan.score.value = 95
        charlotte.score.value = 100
    }
    

    相关文章

      网友评论

        本文标题:RxSwift - Transforming Operators

        本文链接:https://www.haomeiwen.com/subject/hsamrxtx.html