我已经寻找了一种将异步函数传递到核心数据托管对象上下文的方法,但仍然找不到。我怀疑新的异步/等待并发模型的某些部分我不理解,但我不知道它是什么。
我想做的事:
// Grab an moc
let moc = container.newBackgroundContext()
// Enter an async context
Task {
await moc.perform {
// Get some object
let obj = moc.object(with: anObjectID)
// This is not possible because NSManagedObjectContext.perform only accepts
// a synchronous block
await obj.doSomeLongRunningProcess()
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得奇怪的是这是不可能的。我不确定它是否在 Core Data api 中还没有出现,因为 async/await 太新了,或者是否有一个很好的理由它是不可能的?
像这样包裹doSomeLongRunningProcess
起来Task
await moc.perform {
Task {
let obj = moc.object(with: anObjectID)
await obj.doSomeLongRunningProcess()
}
}
Run Code Online (Sandbox Code Playgroud)
不起作用,因为内部Task
在不同的线程上运行,最终会导致 CoreData 不一致。我有点希望它会继承上下文的线程,但事实并非如此。
我想要一种将异步函数传递给 的方法ManagedObjectContext
,但如果失败,我想知道为什么它不起作用?