iOS中的类和线程:viewModel场景

时间:2018-07-01 09:47:44

标签: ios swift multithreading thread-safety closures

我遵循的是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线程中。要求v​​iewModel调用联网对象(dataProvider),该对象也已在main线程中初始化。还从dataProvider线程main进行URLSessionDataTask调用以检索所需的数据。数据任务应该在与main不同的线程中执行异步。一旦完成,它的completedHandler也将在不同于main的线程中执行。在这里,我可以更新viewModel(请参见上面的代码片段)。然后,在观察viewModel中的模型时,在viewController中执行onModelChange闭包,在其中我用数据更新tableView。由于此操作与UI相关,因此我在main线程中进行了此操作(另请参见上面的代码段)。

问题是:这似乎可行,但是实际上在与viewModel不同的线程中更新main是否正确/安全?它是在main线程中创建的。这可能是潜在的问题吗?

viewModel是一个类,其拥有的model是作为结构的MyCustomModel的数组。

0 个答案:

没有答案