Observer
Observer role is to listen for events and then respond to this incident, or any behavior response time is an observer
1. Create a listener in subscribe () method
- The most direct way is to create an observer at
Observable
thesubscribe()
time of the event described method occurs later, you need to how to respond
let observable1 = Observable.of("A", "B", "C", "D")
observable1.subscribe(onNext: { element in
print(element)
}, onError: { error in
print(error)
}, onCompleted: {
print("completed")
}).disposed(by: bag)
2. Create the bind () method
let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable.map { "索引: \($0)" }.bind { self.label.text = $0 }.disposed(by: bag)
3. Use the viewer to create AnyObserver
- AnyObserver can be used to describe any of a viewer
let observer3: AnyObserver<String> = AnyObserver { (event) in
switch event {
case .next(let data):
print(data)
case .error(let error):
print(error)
case .completed:
print("completed")
}
}
let observable3 = Observable.of("A", "B", "C", "D")
observable3.subscribe(observer3).disposed(by: bag)
- With bindTo method
let observer31: AnyObserver<String> = AnyObserver { (event) in
switch event {
case .next(let text):
self.label.text = text
default:
break
}
}
let observable31 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable31.map { "当前索引: \($0)" }.bind(to: observer31).disposed(by: bag)
4. Create a Binder observer
- Compared to the large and AnyObserver, Binder focus more on a particular scene. Binder There are two major characteristics
- Feature 1: does not handle error events
- Feature 2: Make sure the bindings are executed (default MainSchedule) on a given Schedule
- Once the error event, in debug environment will perform fatalError, an error message will be printed in a publishing environment
- Sample sequence number displayed in the text label label display is a typical UI observer, who in response to an event, it will only deal with next event, and the UI update operations need to be performed on the main thread on it. So this case better solution is to use Binder
let observer4: Binder<String> = Binder(label) { (view, text) in
view.text = text
}
let observable4 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable4.map{ "索引显示: \($0)" }.bind(to: observer4).disposed(by: bag)