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&lt;O: ObserverType&gt; 函数调用位置,但找不到;线程直接创建一个键并进入该函数内部。 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(_:_:) 函数感到困惑。这个函数接受一个观察者包(严格来说,一个接受Events 的闭包容器)并将事件发送到包中包含的一个观察者。

【讨论】:

谢谢丹尼尔,我不知道我应该如何理解这个流程,但我会尽量集中注意力。

以上是关于dispatch 和 _synchronized_subscribe RxSwift的主要内容,如果未能解决你的问题,请参考以下文章

10.6 android输入系统_Dispatcher线程_总体框架

react_2/flux

在哪些情况下 __sync_synchronize 会接收任何参数?

这里是不是需要内存屏障“*pEnd_ = v; __sync_synchronize (); ++pEnd_;”?

还是说Memory Model,gcc的__sync_synchronize真是太坑爹了

14_synchronized深入