除了deallocating,还有deallocated:
vc.rx.deallocated
.subscribe { (event) in
print("页面释放了")
}
它的源码相对就简单多了,创建了DeallocObservable
类并通过objc_setAssociatedObject
关联起来:
extension Reactive where Base: AnyObject {
public var deallocated: Observable<Void> {
return self.synchronized {
if let deallocObservable = objc_getAssociatedObject(self.base, &deallocatedSubjectContext) as? DeallocObservable {
return deallocObservable._subject
}
let deallocObservable = DeallocObservable()
objc_setAssociatedObject(self.base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return deallocObservable._subject
}
}
...
}
fileprivate final class DeallocObservable {
let _subject = ReplaySubject<Void>.create(bufferSize:1)
init() {
}
deinit {
self._subject.on(.next(())) //发送
self._subject.on(.completed) //完成
}
}
当页面释放时,DeallocObservable
也会释放,接着deinit
,然后就会发送响应和完成。
网友评论