美文网首页
Transform(转换操作符)

Transform(转换操作符)

作者: 桔子听 | 来源:发表于2018-03-21 20:38 被阅读27次
    • toArray

    将一个个独立的事件,转为一个包含数组的事件

    let disposeBag = DisposeBag()
      Observable.of("A", "B", "C")
        // 2
        .toArray()
        .subscribe(onNext: {
    print($0) })
        .disposed(by: disposeBag)
    
    • map

    Swift的可选类型里也有map和flatmap函数,Swift数组里也有map和flatmap函数。和这里的意义一样,都是将元素通过map转换后,生成新的元素。

    let disposeBag = DisposeBag()
    let formatter = NumberFormatter()
    formatter.numberStyle = .spellOut
    Observable<NSNumber>.of(123, 4, 56)
    .map {
        formatter.string(from: $0) ?? ""
      }
      .subscribe(onNext: {
        print($0)
    })
      .disposed(by: disposeBag)
    
    • flatMap

    如果有这种情况,Observable包含的对象也是Observable,这种情况下,按道理,我们subscribe(onNext)接收到的值就应该是Observable类型,还是一个可观察者。但是通过flatMap,我们拿到的是里面Observable包含的值,而不是Observable本身,这就是说,flatMap帮我们解开了Observable
    从字面上来说,flat就是“平”的意思,这里作动词,就是“打平”。在Swift标准库了,数组也有flatmap函数,这个函数可以将数组“打平”。例如有下面数组["a",["b","c"],"d"],经过flatmap操作后,会形成一个新的数组["a","b","c","d"],也即将里面的数组打平,形成一个不包含数组的数组。
    RxSwift也一样,flatmap将包含ObservableObservable,打平为不包含ObservableObservable

    flatmap官方图
    let disposeBag = DisposeBag()
    let ryan = Student(score: BehaviorSubject(value: 80))
    let charlotte = Student(score: BehaviorSubject(value: 90))
    let student = PublishSubject<Student>()
    student.flatMap {
        $0.score 
    }
      .subscribe(onNext: {
        print($0)
        })
        .disposed(by: disposeBag)
    

    发送事件

    student.onNext(ryan)
    

    打印:

    80
    

    发送事件

    ryan.score.onNext(85)
    

    打印:

    85
    

    发送事件

    student.onNext(charlotte)
    

    打印:

    90
    

    发送事件

    ryan.score.onNext(95)
    

    打印:

    95
    

    发送事件

    charlotte.score.onNext(100)
    

    打印:

    100
    
    • flatMapLatest

    从名称上可以看出,在flatmap基础上,增加了一项,只留最近的一个被观察者。

    let disposeBag = DisposeBag()
    let ryan = Student(score: BehaviorSubject(value: 80))
    let charlotte = Student(score: BehaviorSubject(value: 90))
    let student = PublishSubject<Student>()
    student
      .flatMapLatest {
         $0.score }
      .subscribe(onNext: {
        print($0)
      })
      .disposed(by: disposeBag)
    student.onNext(ryan) //最近的被观察者是ryan的score
    ryan.score.onNext(85)
    student.onNext(charlotte)  //最近的被观察者是charlotte的score
    ryan.score.onNext(95) //给ryan.score发送事件无效
    charlotte.score.onNext(100)
    
    80
    85
    90
    100
    
    • materializedematerialize
    enum MyError: Error {
        case anError
    }
    let disposeBag = DisposeBag()
    let ryan = Student(score: BehaviorSubject(value: 80))
    let charlotte = Student(score: BehaviorSubject(value: 100))
    let student = BehaviorSubject(value: ryan)
    let studentScore = student
    .flatMapLatest {
        $0.score }
    studentScore
      .subscribe(onNext: {
         print($0) })
      .disposed(by: disposeBag)
      ryan.score.onNext(85)
      ryan.score.onError(MyError.anError)
      ryan.score.onNext(90)
      student.onNext(charlotte)
    

    输出

    80
    85
    Received unhandled error: RxSwiftPlayground.playground:
    150:__lldb_expr_171 -> anError
    

    materialize转化为Event

    let studentScore = student
      .flatMapLatest {
        $0.score.materialize()
      }
    

    studentScore的类型为Observable<Event<Int>>

    next(80)
    next(85)
    error(anError)
    next(100)
    

    dematerialize解出值

    studentScore
      .filter {
        guard $0.error == nil else {
          print($0.error!)
    return false
    }
    return true
    }
      .dematerialize()
      .subscribe(onNext: {
    print($0) })
      .disposed(by: disposeBag)
    
    80
    85
    anError
    100
    

    相关文章

      网友评论

          本文标题:Transform(转换操作符)

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