如何正确使用 Core Data 进行多线程处理? [关闭]

Posted

技术标签:

【中文标题】如何正确使用 Core Data 进行多线程处理? [关闭]【英文标题】:How to properly multi-thread with Core Data? [closed] 【发布时间】:2009-11-22 18:11:16 【问题描述】:

我在尝试在线程化 NSOperation 中执行一些核心数据操作时遇到了很多问题。

目前,我在我的应用程序委托中创建了一个托管对象上下文,它纯粹用于我的线程化 NSOperations。我设置了一个最大并发为 1 的 NSOperationQueue,因此每个操作都是连续执行的。对于每个操作(从 Internet 获取数据并创建新的托管对象),我都会将上下文传递给它以供使用。创建新对象后,我保存并重置上下文以供下一个操作使用。但是,我在执行此操作时间歇性地遇到 malloc 错误,我花了几天时间试图弄清楚,这似乎与它的线程化方式有关。

我得到的错误可以在这个相关的stack overflow question 中看到。

当我只是将托管对象的属性设置为 NSNumber 对象时,会发生 malloc 错误。这也是我第一次设置该属性,所以我没有过度释放自己!我根本想不通,我无法使用 GuardMalloc 重现错误,它只是不会发生!好像错误发生在其他被触发的地方,但我不知道在哪里!

那么我所能推断的就是这个错误与我如何设置整个事情有关。我尝试自己运行该操作,而不是将其添加到NSOperationQueue,它似乎工作正常(尽管它挂起主线程!)。

我还需要上下文来通知我的应用程序中的其他上下文何时进行保存,所以我观察到它是NSManagedObjectContextDidSaveNotification 通知。但是,由于保存是在 NSOperation(其他线程)中执行的,是否会因为通知仅在其运行的线程上分派而出现问题?

【问题讨论】:

【参考方案1】:

您是否阅读过核心数据编程指南的Multi-Threading with Core Data 部分?

【讨论】:

是的,我已经读过了,我正在按照它所说的去做所有事情。我为线程使用了一个单独的上下文(它甚至在队列中只有 1 个 NSOperation 失败)并且我没有在线程之间传递任何托管对象。好吧,我在我的应用程序委托中调用一个方法来返回一个对象,但该方法的内部包装在一个 @synchronized(self) 块中,它返回的托管对象位于线程的上下文中。【参考方案2】:

复活一个老问题,但这可能会对某人有所帮助 - 我遇到了与此处描述的相同设置的类似问题(每个 NSOperation 的专用上下文,一个最大并发),我发现这是由于以下事实我在主线程上创建了 NSOperation 专用上下文,然后我尝试在 NSOperation 线程中使用它。一旦我将上下文创建移到 NSOperation 的主函数中,问题就消失了。

【讨论】:

【参考方案3】:

是的,我现在已经成功地完成了所有工作,这让我松了一口气。经过几天的混乱,我决定重写所有与线程和核心数据有关的代码,我不再收到malloc 错误。这是一个相当复杂的设置,所以其中一定有一些非常模糊的东西!

【讨论】:

以上是关于如何正确使用 Core Data 进行多线程处理? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Core data multithreading fetch record

在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?

Core Data 代码和多线程

使用多线程时如何正确处理此错误

Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存