在 swift 中,我们是否需要在 ViewController 中编写的其他对象的闭包中添加“@MainActor in”?

问题描述 投票:0回答:1

我见过这样的代码

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,所以将此视为新手疑问。

ios swift actor mainactor
1个回答
0
投票

这取决于视图模型的编写方式以及

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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.