Гарантирует ли .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 о том, какой планировщик использовать; еще одна часто неправильно понимаемая тема.

0 ответов

Другие вопросы по тегам