小编e45*_*ojn的帖子

SwiftUI 并发:仅在后台线程上运行活动

当我的内容视图加载并且用户第一次打开应用程序时,我会联系 API。

但是,我不希望这妨碍了主要内容。我收到的数据永远不会更新/影响 UI。所以它应该完全在后台运行。

现在,它运行如下:

struct ContentView: View {

    @StateObject var settings = Settings()

    var body: some View {

    }
    .task {
            await loadData()
    }

    func loadData() async {
            // Call an api.
            // get some data using URLSession
            settings.data = data
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:[SwiftUI] 不允许从后台线程发布更改;确保在模型更新时从主线程发布值(通过像 receive(on:) 这样的运算符)。

我想我明白了:SwiftUI 认为我想要更新 UI 的任务。

为了解决这个问题,我尝试了:

    .task {
        DispatchQueue.global(qos: .background).async {
            await loadData()
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,我得到: 无法将类型为 '@Sendable () async -> ()' 的函数传递给需要同步函数类型的参数

在这种情况下我将如何使用调度队列?我只针对 iOS 15+。

concurrency ios swiftui

4
推荐指数
2
解决办法
5157
查看次数

标签 统计

concurrency ×1

ios ×1

swiftui ×1