小编Jer*_*Som的帖子

是否可以将异步函数传递给 Swift 中的核心数据托管对象上下文?如果不是,那为什么?

我已经寻找了一种将异步函数传递到核心数据托管对象上下文的方法,但仍然找不到。我怀疑新的异步/等待并发模型的某些部分我不理解,但我不知道它是什么。

我想做的事:

// 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,但如果失败,我想知道为什么它不起作用?

concurrency core-data task async-await swift

7
推荐指数
1
解决办法
1998
查看次数

标签 统计

async-await ×1

concurrency ×1

core-data ×1

swift ×1

task ×1