subject即是被观察者也是观察者。
Subject类型
PublishSubject
没有初始值,要先订阅,才会发送事件。
BehaviorSubject
有一个初始值,对于新的订阅,会重发最近的一次事件,如果没有其他事件,会重发初始值的事件。
let subject = BehaviorSubject(value: "Initial value")
ReplaySubject
有一个初始的缓冲大小,有新的订阅,会重发缓冲起来的所有事件。
let subject = ReplaySubject<String>.create(bufferSize: 2)
Variable
对BehaviorSubject的包装,保存当前的值作为state,有新的订阅,重发最近的一次事件,如果没有其他事件,会重发初始值的事件。
let variable = Variable("Initial value")
let disposeBag = DisposeBag()
variable.value = "New initial value"
variable.asObservable()
.subscribe {
print(label: "1)", event: $0)
}
.disposed(by: disposeBag)
Variable需要初始值,用asObservable转为Observable,用value直接取得当前值。
如果这里的value是数组,改变数组也会触发事件。和KVO监听属性不一样。
PublishSubject代替delegate回调
在需要回调的页面里定义PublishSubject,但不要直接暴露PublishSubject,提供一个获取PublishSubject的方法:
private let selectedPhotosSubject = PublishSubject<UIImage>()
var selectedPhotos: Observable<UIImage> {
return selectedPhotosSubject.asObservable()
}
// 发事件
selectedPhotosSubject.onNext(image)
在
viewWillDisappear中发送onComplete(),避免内存泄漏。
在其他页面获取到selectedPhotosSubject,进行监听,获取回调值。
photosViewController.selectedPhotos
.subscribe(onNext: { [weak self] newImage in
}, onDisposed: {
print("completed photo selection")
})
.disposed(by: bag)









网友评论