Классы и многопоточность в iOS: сценарий viewModel - PullRequest
0 голосов
/ 01 июля 2018

Я следую архитектуре 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, которые являются структурами.

...