在上文我们已经有介绍了Observable 跟 Observer 的作用与运用。并且已经知道使用subscribe()
来会订阅 Observable 。
那么今天我们就来了解一下AnyObserver 与 Binder
AnyObserver
AnyObserver从字面意义上来理解,就是任意一种观察者。
我们先看一下案例
- 通常情况下我们创建序列的时候是这样的
//创建序列
let testOB = Observable<String>.create { ob in
ob.onNext("test")
ob.onCompleted()
return Disposables.create()
}
//订阅序列
testOB.subscribe(onNext: { (str) in
print(str)
}, onError: { (error) in
print(error)
}, onCompleted: {
print("completed")
}).disposed(by: disposebag)
- 那么用了AnyObserver是什么样
let observer: AnyObserver<String> = AnyObserver { (event) in
switch event {
case .next(let str):
print("next event: \(str)")
case .error(let error):
print("have an error: \(error)")
case .completed:
print("observer complete")
}
}
let ob:Observable<String> = Observable.just("this is a message from just")
ob.subscribe(observer).disposed(by: disposebag)
打印结果:
next event: this is a message
observer complete
很好理解,就是把订阅的那一长串代码,抽离出来。并且我们可以做这样大胆的操作。
- 多个序列共用同一个observer
let observer: AnyObserver<String> = AnyObserver { (event) in
switch event {
case .next(let str):
print("next event: \(str)")
case .error(let error):
print("have an error: \(error)")
case .completed:
print("observer complete")
}
}
let ob:Observable<String> = Observable.just("this is a message from just")
ob.subscribe(observer).disposed(by: disposebag)
enum MyError: Error {
case errorA
case errorB
}
//只发送一个error
let ob2 = Observable<String>.error(MyError.errorA)
ob2.subscribe(observer).disposed(by: disposebag)
//只发送一个completed
let ob3 = Observable<String>.empty()
ob3.subscribe(observer).disposed(by: disposebag)
打印结果:
next event: this is a message
observer complete
have an error: errorA
observer complete
Binder
Binder 主要有以下两个特征:
- 不会处理错误事件
- 确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler)
一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息。”
摘录来自: “RxSwift 中文文档。”
案例:
我们当前监听一个String,然后需要给一个label赋值
以我们目前所了解到的RxSwift的内容,那么我们需要这么做。
//创建序列
let testOB = Observable<String>.create { ob in
ob.onNext("this is label text")
ob.onCompleted()
return Disposables.create()
}
//订阅序列
testOB.subscribe(onNext: { (str) in
self.titleLabel.text = str
}).disposed(by: disposebag)
在使用Binder前,其实代码已经不算多了,但是还可以再精简。
let binder:Binder<String> = Binder(titleLabel){ (label,str) in
label.text = str
}
Observable<String>.just("😜😜😜😜")
.bind(to: binder)
.disposed(by: disposebag)