В ReactiveSwift сигнал наблюдателя отправляет сигнал только при явном вызове из основного потока - PullRequest
0 голосов
/ 03 января 2019

Я некоторое время использую ReactiveSwift, но неожиданно обнаружил странную ошибку или что-то в этом роде.

Я использую архитектуру MVVM и имею простой контроллер представления и модель представления для него.Виртуальная машина имеет одно свойство типа 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: ())
    }

Я не могу понять, почему это происходит.Init для самой модели представления вызывается в основном потоке, так что может вызвать такое поведение?Заранее спасибо.

1 Ответ

0 голосов
/ 03 января 2019

Ваша модель отправляет значение во время инициализации.

Однако ваша функция viewDidLoad устанавливает наблюдателя после его инициализации, поэтому он не готов его наблюдать.Последующие вызовы будут работать, поскольку наблюдатель теперь настроен.

У вас есть несколько вариантов, но в основном вам нужно изменить последовательность.

...