我遵循的是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
不同的线程中执行异步。一旦完成,它的completedHandler也将在不同于main
的线程中执行。在这里,我可以更新viewModel(请参见上面的代码片段)。然后,在观察viewModel中的模型时,在viewController中执行onModelChange
闭包,在其中我用数据更新tableView。由于此操作与UI相关,因此我在main
线程中进行了此操作(另请参见上面的代码段)。
问题是:这似乎可行,但是实际上在与viewModel
不同的线程中更新main
是否正确/安全?它是在main
线程中创建的。这可能是潜在的问题吗?
viewModel
是一个类,其拥有的model
是作为结构的MyCustomModel
的数组。