如何使用 swift 并发模型从 SwiftUI 视图安全地访问核心数据 NSManagedObject 属性?

问题描述 投票:0回答:1

如何使用 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!
}
swift swiftui core-data swift-concurrency
1个回答
0
投票

您的代码不完整,但类似的代码应该可以工作。创建一个函数来执行获取,这个函数也是您创建后台上下文的地方

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
© www.soinside.com 2019 - 2024. All rights reserved.