同一 NSManagedObjectContext 对象上的多个并发 perform() 调用

Posted

技术标签:

【中文标题】同一 NSManagedObjectContext 对象上的多个并发 perform() 调用【英文标题】:Multiple concurrent perform() calls on same NSManagedObjectContext object 【发布时间】:2020-01-22 04:12:14 【问题描述】:

当多个perform()调用在同一个NSManagedObjectContext对象上被调用时,它们会按照它们被调用的顺序一个一个地执行吗?我认为这是真的,因为the document 说

Core Data 使用线程(或序列化队列)限制来保护 托管对象和托管对象上下文(参见核心数据编程 指南)。

这表明托管对象上下文及其线程具有 1:1 映射,并且所有 perform() 调用都是串行的。但令我害怕的是,我找不到任何明确的讨论,甚至在 Apple 的文档中也找不到。

在我的应用程序中,我使用 NSPersistentContainer 设置了一个 CoreData 堆栈,并创建了一个专用的后台上下文来修改托管对象。当调用perform() 调用时,可能会发生之前的perform() 调用尚未完成。因此,在这种情况下,它们被一一执行是至关重要的。这就是为什么我想在上面确认我的理解。

注意:我知道perform() 是异步的,但这是从调用者的角度来看的。我问的是从被调用者的角度。

【问题讨论】:

【参考方案1】:

是的,多个 perform 调用将排队并以相同的顺序执行。

【讨论】:

以上是关于同一 NSManagedObjectContext 对象上的多个并发 perform() 调用的主要内容,如果未能解决你的问题,请参考以下文章

CoreData多线程安全

无法在 NSManagedObjects 之间建立关系

父/子 NSManagedObjectContext 不起作用

NSManagedObjectContext:自动更新与否?

NSManagedObjectContext:撤消保存操作?

声明 NSManagedObjectContext 时出错