Я следую архитектуре MVVM
, поэтому у меня есть viewController
, который содержит ссылку на viewModel
, например:
lazy private var viewModel: MyViewModel = {
return MyViewModel()
}()
Такая viewModel инициализируется в методе viewDidLoad()
следующим образом:
private func initViewModel() {
viewModel.onModelChange = { [unowned self] () in
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
viewModel.getData()
}
Где getData()
метод viewModel вызывает другой объект для выполнения асинхронной сетевой задачи для извлечения данных, отображаемых viewController:
func getData() {
guard let url = ServiceAPI.getServiceUrl() else {
return
}
dataProvider.getData(url: url, completion: {[weak self] (result, error) -> Void in
if let error = error {
self?.model = [MyCustomModel]()
} else {
if let result = result {
self?.total = result.data.total
self?.processFetchedData(items: result.data.items)
} else {
self?.model = [MyCustomModel]()
}
}
})
}
Что касается потоков, сценарий таков: viewModel инициализируется viewController и привязывается к нему в потоке main
. ViewModel запрашивается вызвать сетевой объект (dataProvider
), также инициализированный в потоке main
. dataProvider
также вызывает из потока main
URLSessionDataTask
для получения необходимых данных. Предполагается, что задача обработки данных выполняется асинхронно в потоке, отличном от main
. После завершения его завершениеHandler также выполняется в потоке, отличном от main
. Здесь я обновляю viewModel (см. Фрагмент кода выше). Затем, когда наблюдается модель в viewModel, в viewController выполняется закрытие onModelChange
, где я обновляю tableView с данными. Поскольку эта операция связана с пользовательским интерфейсом, я делаю это в потоке main
(см. Также фрагмент кода выше).
Вопрос: кажется, это работает, но действительно ли правильно / безопасно обновлять viewModel
в потоке, отличном от main
? Он был создан в потоке main
. Может ли это быть потенциальной проблемой?
viewModel
- это класс, а model
содержит массив MyCustomModel
, которые являются структурами.