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

时间:2019-01-03 18:10:50

标签: ios swift reactive reactive-swift

我正在使用ReactiveSwift一段时间,但突然遇到了一个奇怪的错误或其他东西。

我正在使用MVVM体系结构,并具有一个简单的视图控制器和一个视图模型。 VM具有类型Signal<Void, NoError>的单个属性。在VM的初始化中,我向其观察者发送了一个空值。在视图控制器的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是在主线程上调用的,那么可能导致这种行为的原因是什么? 预先感谢。

1 个答案:

答案 0 :(得分:2)

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

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

您有一些选择,但是基本上您需要更改顺序。