【问题标题】:How to publish change from async function如何从异步函数发布更改
【发布时间】:2022-11-30 15:40:36
【问题描述】:

我有类符合 ObservableObject 与

@Published var fileContent = ""

定义。此外,我有返回 String 的 getFileContent() 异步函数。 如果我这样调用函数

Task {
    fileContent = await getFileContent(forMeasurementID: id, inContext: context)
}

代码已编译且应用程序运行正常,但 XCode 抱怨“紫色”错误“不允许从后台线程发布更改;确保在模型更新时从主线程发布值(通过像 receive(on:) 这样的运算符)。”。我试图用 receive(on:) 进行详细说明,但到目前为止没有成功。 我会很感激任何提示。谢谢。

【问题讨论】:

    标签: swiftui async-await


    【解决方案1】:

    除非您在主线程中,否则您无法更改应用程序的状态(更改 @Published var)。

    以下是您的代码的工作原理:

    Task {
        let content = await getFileContent(forMeasurementID: id, inContext: context)
        DispatchQueue.main.async {
            fileContent = content
        }
    }
    

    【讨论】:

    • 我当然不能……这么简单……谢谢@HunterLion
    【解决方案2】:

    那么,在异步/等待世界中,最好使用 MainActor,例如

    Task {
        let content = await getFileContent(forMeasurementID: id, inContext: context)
        await MainActor.run {
            // fileContent will be updated on the Main Thread
            fileContent = content
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多