上文RxSwift-deallocating,deallocated源碼解析虐译,我們提到deallocating
序列和takeUntil
序列經(jīng)常結(jié)合起來使用,本文將分析takeUntil
,探索一下takeUntil
內(nèi)部是如何接收deallocating
發(fā)送的響應(yīng)非常有必要捡絮。
takeUntil源碼解析
public func takeUntil<Source: ObservableType>(_ other: Source)
-> Observable<Element> {
return TakeUntil(source: self.asObservable(), other: other.asObservable())
}
返回的是一個(gè)TakeUntil
序列,TakeUntil
對(duì)象依然繼承自我們熟悉的Producer
。
final private class TakeUntil<Element, Other>: Producer<Element> {
fileprivate let _source: Observable<Element>
fileprivate let _other: Observable<Other>
init(source: Observable<Element>, other: Observable<Other>) {
self._source = source
self._other = other
}
override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
let sink = TakeUntilSink(parent: self, observer: observer, cancel: cancel)
let subscription = sink.run()
return (sink: sink, subscription: subscription)
}
}
TakeUntil
序列保存了原始序列_source
(上文的例子中,_source
保存的是vc.publicOB
序列)以及序列_other
(上文的例子中,_other
保存的就是vc.rx.deallocating
序列)
外界的subscribe
的是TakeUntil
序列截亦。TakeUntil
序列被訂閱時(shí),會(huì)執(zhí)行TakeUntil.run
,TakeUntil.run
調(diào)用TakeUntilSink.run
init(parent: Parent, observer: Observer, cancel: Cancelable) {
self._parent = parent
super.init(observer: observer, cancel: cancel)
}
TakeUntilSink
保存TakeUntil
到_parent
屬性.
func run() -> Disposable {
let otherObserver = TakeUntilSinkOther(parent: self)
let otherSubscription = self._parent._other.subscribe(otherObserver)
otherObserver._subscription.setDisposable(otherSubscription)
let sourceSubscription = self._parent._source.subscribe(self)
return Disposables.create(sourceSubscription, otherObserver._subscription)
}
TakeUntilSink.run
中,
1.創(chuàng)建觀察者TakeUntilSinkOther
, TakeUntilSinkOther
的_parent
保存TakeUntilSink
2.self._parent._other.subscribe(otherObserver)
訂閱序列,這個(gè)序列就是上文的例子的vc.rx.deallocating
序列猎唁。
RxSwift-deallocating,deallocated源碼解析中,我們提到當(dāng)對(duì)象在dealloc
時(shí),會(huì)向DeallocatingProxy
中存儲(chǔ)ReplaySubject
序列(就是vc.rx.deallocating
序列)發(fā)送響應(yīng),會(huì)來到這里的觀察者TakeUntilSinkOther.on(.next())
func on(_ event: Event<Element>) {
self.synchronizedOn(event)
}
func _synchronized_on(_ event: Event<Element>) {
switch event {
case .next:
self._parent.forwardOn(.completed)
self._parent.dispose()
case .error(let e):
self._parent.forwardOn(.error(e))
self._parent.dispose()
case .completed:
self._subscription.dispose()
}
}
TakeUntilSinkOther.on(.next())
----->Sink.forwardOn(.completed)
----->TakeUntilSink.observer.(.completed)
.
最終會(huì)給TakeUntil
序列的observer
發(fā)送.completed
信號(hào)误证,序列完成并銷毀倔幼。
總結(jié)
1.takeUntil
是一個(gè)中間層盖腿,在takeUntil
被訂閱的流程中,中間層takeUntil
會(huì)訂閱rx.deallocating()
序列.
2.當(dāng)對(duì)象被銷毀,對(duì)rx.deallocating()
發(fā)送響應(yīng)時(shí),會(huì)調(diào)用到觀察者的TakeUntilSinkOther.on(.next())
,最終會(huì)給TakeUntil
序列的observer
發(fā)送.completed
信號(hào),序列完成并銷毀凤藏。