我见过这样的代码
func connectVCAndVM() {
// Setting up a closure to be called when data in the viewModel changes
viewModel.dataChanged = { [weak self] in
Task { @MainActor in
// Reloading the tableView when data changes
self?.tableView.reloadData()
}
}
}
我们这里需要“@MainActor in”吗?如果任务写在viewcontroller内部,由于上下文继承,任务不会自动在主线程中执行吗?我正在学习 Actor,所以将此视为新手疑问。
这取决于视图模型的编写方式以及
dataChanged
的定义方式。
视图模型的全部目的是与视图集成,所有视图交互都必须从主线程完成,因此我们经常编写视图模型,以便仅从主线程调用闭包(明确地,所以你不需要不需要做像你在这里那样的事情)。
就我个人而言,我倾向于这样定义闭包:
class ViewModel {
var dataChanged: (@Sendable @MainActor () -> Void)?
…
}
这样,视图和视图模型都知道这个闭包将在主要参与者上调用。
然后视图控制器可以简单地:
func connectVCAndVM() {
// Setting up a closure to be called when data in the viewModel changes
viewModel.dataChanged = { [weak self] in
self?.tableView.reloadData()
}
}