dispatch 和 _synchronized_subscribe RxSwift
Posted
技术标签:
【中文标题】dispatch 和 _synchronized_subscribe RxSwift【英文标题】:dispatch and _synchronized_subscribe RxSwift 【发布时间】:2021-12-31 16:09:08 【问题描述】:我正在尝试了解 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 怎么会跳到那里,即使不叫也很难,有什么魔力?
【问题讨论】:
你使用的是什么版本的 RxSwift?这不是最新的... 更新了最新版本,但代码几乎相同。也更新了问题。 问了一个如此广泛以至于几乎毫无意义的问题(“发生了什么事”),然后是另一个问题。 “需要关注”是股票关闭的原因。为了避免它,它有助于非常具体:一个问题关于一件明确的事情。 提示:你看到func synchronized_subscribe...
在里面另一个func
吗?
所有的函数都被调用了,所以我不确定你所说的“RxSwift 怎么会跳到那里,即使它没有被调用”。
【参考方案1】:
我不确定这里真正问的是什么...逻辑是当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(_:_:)
函数感到困惑。这个函数接受一个观察者包(严格来说,一个接受Event
s 的闭包容器)并将事件发送到包中包含的一个观察者。
【讨论】:
谢谢丹尼尔,我不知道我应该如何理解这个流程,但我会尽量集中注意力。以上是关于dispatch 和 _synchronized_subscribe RxSwift的主要内容,如果未能解决你的问题,请参考以下文章
10.6 android输入系统_Dispatcher线程_总体框架
在哪些情况下 __sync_synchronize 会接收任何参数?
这里是不是需要内存屏障“*pEnd_ = v; __sync_synchronize (); ++pEnd_;”?