Transform(转换操作符)

2018-03-21  本文已影响27人  桔子听

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

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

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)

如果有这种情况,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

从名称上可以看出,在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
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
上一篇下一篇

猜你喜欢

热点阅读