如何使用 swift 并发模型从 SwiftUI 视图安全地访问核心数据 NSManagedObject 属性。
我的理解是,我们需要将对 NSManageObject 属性的任何访问包含在
await context.perform {}.
中,但是如果我在视图中的任何位置使用它,即在 body(),
或 init()
或 .task()
修饰符中,我会收到以下警告或错误:
对于
.task{}
修饰符或在任何 Task {}:
内
在主参与者隔离上下文之外传递不可发送类型“NSManagedObjectContext.ScheduledTaskType”的参数可能会引入数据竞争 即使我专门为此访问创建了一个新上下文,也会发生这种情况。
如果在
body()
或 init():
之内
在不支持并发的函数中使用“await”
但是我们不能将 body 或 init() 设置为 async
代码示例如下:
var attributeString: String = ""
let context = PersistentStore.shared.persistentContainer.newBackgroundContext()
await context.perform {
attributeString = nsmanagedObject.attribute!
}
您的代码不完整,但类似的代码应该可以工作。创建一个函数来执行获取,这个函数也是您创建后台上下文的地方
func fetchObject(/* params... */) async -> SomeManagedObject {
let context = PersistentStore.shared.persistentContainer.newBackgroundContext()
return await context.perform {
/* fetch */
return fetchedObject
}
}
然后在您看来,您调用该函数并使用它
.task {
let managedObject = await fetchObject(/* params */)
attributesString = managedObject.attribute