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)
网友评论