什么是Subject?
一个既是Observable又是Observer的东西
PublishSubject
要先订阅,才能收到事件。刚开始是空的
let subject = PublishSubject<Void>()
// 1
button.rx.tap
.subscribe(onNext: { _ in
print("=== A Tap ===")
subject.onNext(())
})
.disposed(by: disposeBag)
// 2
delay(2) {
subject
.subscribe(onNext: {
print("B Tap")
})
.disposed(by: self.disposeBag)
}
// 3
delay(4) {
subject
.subscribe(onNext: {
print("C Tap")
})
.disposed(by: self.disposeBag)
}
BehaviorSubject
如果你要拿到上一次的值,那么可以使用BehaviorSubject,创建时会有一个预设值
let subject = BehaviorSubject<String>(value: "1")
ReplaySubject
如果你要一订阅就拿到上n次的值,那你要选择ReplaySubject
let subject = ReplaySubject<String>.create(bufferSize: 2)
PublishRelay
只接受.next事件,不接受.error或.completed。也就是说,它不会中断。
PublishRelay其实就是PublishSubject再包一层,因为只能接收.next,所以语法变成了 .accept。和 PublishSubject 一样需要提前订阅
let subject = PublishRelay<String>()
subject.accept("1")
subject
.debug("A")
.subscribe()
.disposed(by: disposeBag)
subject.accept("2")
BehaviorRelay
跟PublishRelay一样,BehaviorRelay就是BehaviorSubject的封裝,跟BehaviorSubject一样,有.value()可以使用,但因为Relay不会.error或disposed的问题,自然也不用处理意外状况。
网友评论