程序员iOS Developer

RxSwift - Transforming Operators

2017-08-15  本文已影响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
}
上一篇下一篇

猜你喜欢

热点阅读