在 ReactiveSwift 中,信号观察器仅在从主线程显式调用时才发送信号

In ReactiveSwift signal observer sends a signal only when explicitly called from main thread

我用了一段时间的ReactiveSwift,突然遇到了一个奇怪的bug什么的。

我使用的是 MVVM 架构,并且有一个简单的视图控制器和一个视图模型。 VM 有一个 属性 类型 Signal<Void, NoError>。在 VM 的 init 中,我向其观察者发送一个空值。在视图控制器的 viewDidLoad 上,我监听该信号并打印一些文本。 这是视图模型:

class SomeVCModel {

let (someSignal, someSignalObserver) = Signal<Void, NoError>.pipe()

init() {

    print (Thread.isMainThread)

    DispatchQueue.main.async {
        self.someSignalObserver.send(value: ())
    }

  }
}

这是视图控制器:

class SomeVC  {

var model: SomeVCModel!

override func viewDidLoad() {
    super.viewDidLoad()

    model = SomeVCModel()

    model.someSignal.observeValues { (_) in
        print ("Some Value")
    }
  }
}

在这种情况下,不会调用 print 语句。但是,当我通过从 DispatchQueue 显式定义主线程向观察者发送一个值时,一切正常:

DispatchQueue.main.async {
        self.someSignalObserver.send(value: ())
    }

我不明白为什么会这样。视图模型本身的 Init 是在主线程上调用的,那么什么会导致这种行为呢? 提前致谢。

您的模型在初始化期间发送值。

但是,您的 viewDidLoad 函数在 初始化之后设置了观察者 ,因此它还没有准备好观察它。由于现在已配置观察器,因此后续调用将起作用。

你有几个选项,但基本上你需要改变顺序。