用于在 Task 中从主线程设置 ObservableObject 属性的语法糖。
Task {
self.setOnMain.status = "Now I'll never get purple warnings again!"
}
您可以使用 Swift Package Manager,方法是在您的 Package.swift
文件中将 MainThreadPropertyAccessor 声明为依赖项。
.package(url: "https://github.com/theisegeberg/MainThreadPropertyAccessor", from: "0.1.0")
有关更多信息,请参阅 Swift Package Manager 文档。
ObservableObject
通常用作 SwiftUI View
的一种控制器。在引入结构化并发(async/await)之后,我们经常需要在 ObservableObject
内部设置 @Published
属性的值。这意味着将代码包装在 DispatchQueue.main.async { ... }
中,或者使用 @MainActor
注解的方法。 这可以实现,但代码量很大。
一个没有要求的协议,提供一个默认扩展,该扩展仅公开一个计算属性:.setOnMain
。 这返回一个对象,可以基于实现该协议的 ObservableObject
的 KeyPath
进行下标访问。
MainThreadPropertyAccessor
添加到您的 ObservableObject
中self.setOnMain.somePropertyOfYourObject = newValue
在您的 ObservableObject
上设置属性class AnObservableObject: ObservableObject, MainThreadPropertyAccessor {
@Published var status:String = ""
func updateStatus() {
Task {
// Do some async work
self.status = "Will update the UI from a background thread" // Warning!
self.setOnMain.status = "Will update the UI from the main dispatch queue" // 😘
}
}
}