如何使用Core Data正确多线程?

时间:2009-11-22 18:11:17

标签: iphone multithreading core-data nsoperation

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

目前,我已经在我的app委托中创建了一个托管对象上下文,它纯粹用于我的线程NSOperations。我设置了一个NSOperationQueue,其最大并发度为1,因此每个动作都是串行执行的。对于每个操作(从Internet获取数据并创建新的托管对象),我将其传递给要使用的上下文。创建新对象后,我保存并重置上下文以供下一个要使用的操作。但是,在执行此操作时,我间歇性地遇到malloc错误,并且我花了好几天试图解决它,并且它似乎与它的线程有关。

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

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

然后我可以推断的是,错误与我如何设置整个事物有某种联系。我尝试自己运行该操作,而不是将其添加到NSOperationQueue,它似乎工作正常(虽然它挂起主线程!)。

我还需要上下文在我的应用程序中进行保存时通知其他上下文,因此我会观察NSManagedObjectContextDidSaveNotification通知。但是,由于正在NSOperation(其他线程)中执行保存,因此只会在运行它的线程上调度通知时会出现问题吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

是的,我已经设法让它现在全部工作,让我感到宽慰。搞砸了几天后,我决定重写所有与线程和核心数据相关的代码,我不再收到malloc错误。这是一个相当复杂的设置,因此必定有一些相当模糊的东西!