我試圖理解 RxSwift 的核心邏輯,我有一個簡單的按鈕,當 onNext(5) 觸發時,它會觸發并列印控制臺。
我正在關注 Xcode 左側的執行緒,如下所示。
-RxSwift 庫
// Step 1
public func onNext(_ element: E) {
self.on(.next(element))
}
// Step 2
public func on(_ event: Event<Element>) {
#if DEBUG
self._synchronizationTracker.register(synchronizationErrorMessage: .default)
defer { self._synchronizationTracker.unregister() }
#endif
dispatch(self._synchronized_on(event), event)
}
//Step 3
@inline(__always)
func dispatch<E>(_ bag: Bag<(Event<E>) -> Void>, _ event: Event<E>) {
bag._value0?(event)
/// after dispatch calling, it is creating BagKey as below
func synchronized_subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {
if let stoppedEvent = self._stoppedEvent {
observer.on(stoppedEvent)
return Disposables.create()
}
if self._isDisposed {
observer.on(.error(RxError.disposed(object: self)))
return Disposables.create()
}
let key = self._observers.insert(observer.on) // directly flow comes here and my question is related with this step
return SubscriptionDisposable(owner: self, key: key)
}
// Step 4
MapSink.on(_:)
// Step 5 FilterSink - PublishSubject... and flow goes on prints
我的代碼
import UIKit import RxSwift class ViewController: UIViewController { let publisher = PublishSubject<Int>() let disposeBag = DisposeBag() @IBOutlet weak var button: UIButton! override func viewDidLoad() { super.viewDidLoad() publisher .map { $0 * 2} .filter { $0 > 4 } .subscribe(onNext: { n in print("We've got number \(n)!") }) .disposed(by: disposeBag) } @IBAction func trigger(_ sender: Any) { print("button triggered") publisher.onNext(5) } }
我的問題是第 3 步發生了什么,您能解釋一下嗎?我也檢查了synchronized_subscribe<O: ObserverType>函式呼叫的地方,但找不到它;執行緒直接創建一個鍵并進入此函式內部。為什么 RxSwift 跳到那里甚至不叫它強硬,這是什么魔法?
uj5u.com熱心網友回復:
我不確定這里真正問的是什么......邏輯是當onNext(5)被呼叫時,它會向Event.next(5)每個訂閱者發送一個(其中只有一個。)
至于呼叫什么函式,鏈條是這樣的:
ObserverType.onNext(_ element: Element)
PublishSubject<Element>.on(_ event: Event<Element>)
PublishSubject<Element>.synchronized_on(_ event: Event<Element>) // gets Bag of observers
dispatch<Element>(_ bag: Bag<(Event<Element>) -> Void>, _ event: Event<Element>) // dispatches event to each observer in the bag.
MapSink<SourceType, Observer: ObserverType>.on(_ event: Event<Self.Element>) // this is one of the observers.
您似乎對dispatch(_:_:)功能感到困惑。這個函式接受一個觀察者包(嚴格地說,一個接受Events的閉包容器)并將事件發送到包中包含的一個觀察者。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/400059.html
