Гарантирует ли .receive(on:) значение свойства @Published после выполнения блока .sink()?
Распространенной ошибкой является ожидание того, что@Published
значение свойства было обновлено при выполнении блока. Однако в этом случае свойство по-прежнему имеет старое значение, поскольку оно запускаетсяwillSet
(как описано здесь).
Некоторые предполагают, например здесь , что добавление решает эту проблему.
Но я также где-то читал, что добавление , не является фундаментальным решением. Это заставляет меня думать, что он все еще может выйти из строя при определенных условиях.
Итак, мой вопрос: гарантирует ли добавление, что блок будет выполнен после того, как значение свойства будет фактически установлено (иdidSet
звонили)?
Вот некоторый код из приведенного выше примера видео. Без.receive(on:)
, в таблице не отображаются новые["One", "Two", "Three"]
содержание послеaddItems()
называется; Хотя.sink()
блок выполняется.
override func viewDidLoad()
{
super.viewDidLoad()
viewModel.$dataSource
.receive(on: RunLoop.main) <<=== 'fixes' issue
.sink(receiveValue:
{ [weak self] _ in
self?.tableView.reloadData()
})
}
@IBAction func addItems()
{
viewModel.dataSource = ["One", "Two", "Three"]
}
В качестве биса, вот симпатичный ответ от @robmayoff о том, какой планировщик использовать; еще одна часто неправильно понимаемая тема.