You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:33:42