MainActor视图模型混合上下文工作:选nonisolated还是async函数?
引言
我声明了如下视图模型:
@MainActor class ContentViewModel: ObservableObject { ... }
我想为该模型添加一个函数,使其能在MainActor上下文内外完成混合工作。
我做了一些实验,得出了两种可行方案,具体如下:
方案一
将视图模型中的新函数标记为nonisolated,并在函数内部启动一个Task,代码如下:
nonisolated func someFunction() { Task { // 在这里执行任务 // 使用 'await' 调用 MainActor 上下文的方法 // 以及进行其他异步调用 } }
在视图中调用该函数的方式如下:
Button("Execute") { viewModel.someFunction() }
方案二
将视图模型中的新函数标记为async,不启动Task,代码如下:
func someFunction() async { // 在这里执行任务 // 由于该函数运行在 MainActor 上下文中,调用 MainActor 上下文的方法无需使用 'await' // 使用 'await' 进行异步调用 // 并在这些调用执行期间释放 MainActor }
在视图中调用该函数的方式如下:
Button("Execute") { Task { await viewModel.someFunction() } }
问题
上述两种方案是否各有优劣,还是功能完全相同?是否存在更符合Swift和SwiftUI规范的替代方案,且比上述两种方案更具优势?
更新说明
最初提出此问题时,我误以为在方案二的someFunction()中调用MainActor上下文必须使用await,这一观点是错误的。
我已修改方案二代码块中的注释,移除了这一错误假设,以免误导后续看到此问题的人。
内容的提问来源于stack exchange,提问作者Adil Hussain
相关产品推荐
相关产品推荐

