2009-11-22 78 views
0

我在尝试在线程NSOperation中执行一些核心数据操作时遇到了很多问题。如何正确使用核心数据进行多线程?

目前,我在我的应用程序委托中创建了一个托管对象上下文,它纯粹用于我的线程NSOperations。我设置了一个最大并发数为1的NSOperationQueue,因此每个操作都是连续执行的。对于每个操作(从互联网获取数据并创建新的托管对象),我将其传递给使用的上下文。一旦创建新对象,我将保存并重置上下文以供下一个要使用的操作。然而,我在做这件事的时候间歇性地得到了malloc错误,而且我花了好几天的时间试图弄清楚它,看起来似乎与它的线程有关。

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

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

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

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

回答

0

对,我已经设法让所有的工作现在,很多我的安慰。在经历了几天的混乱之后,我决定重写所有使用线程和核心数据的代码,并且我不再得到malloc错误。这是一个相当复杂的设置,所以在那里肯定有一些非常模糊的东西!

2

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

+0

是的,我已经读过了,而且我正在根据它应该如何做所有事情。我为这个线程使用了一个单独的上下文(它甚至在队列上只有一个'NSOperation'),我没有在线程之间传递任何管理对象。那么,我在我的应用程序委托中调用一个方法来返回一个对象,但方法的内部被封装在一个@synchronized(self){}块中,并且它返回的被管理对象位于线程的上下文中。 – 2009-11-22 18:26:10

2

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