Transform(转换操作符)
2018-03-21 本文已影响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
将包含Observable
的Observable
,打平为不包含Observable
的Observable
。
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
-
materialize
和dematerialize
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