1

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

我正在使用 MVVM 架构,并有一个简单的视图控制器和一个视图模型。VM 有一个类型为 的属性Signal<Void, NoError>。在虚拟机的初始化中,我向它的观察者发送一个空值。在视图控制器上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: ())
    }

我不知道为什么会这样。在主线程上调用视图模型本身的初始化,那么什么可能导致这种行为?提前致谢。

4

1 回答 1

2

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

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

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

于 2019-01-03T18:19:38.877 回答