Iphone 如何正确使用核心数据进行多线程?

Iphone 如何正确使用核心数据进行多线程?,iphone,multithreading,core-data,nsoperation,Iphone,Multithreading,Core Data,Nsoperation,在线程操作中执行一些核心数据操作时,我遇到了很多问题 目前,我已在我的应用程序委托中创建了一个托管对象上下文,该上下文仅用于我的线程化操作。我设置了一个NSOperationQueue,最大并发度为1,因此每个操作都是串行执行的。对于每个操作(从internet获取数据并创建新的托管对象),我都将上下文传递给它以供使用。创建新对象后,我保存并重置上下文,以便下一个操作使用。然而,在执行此操作时,我会间歇性地遇到malloc错误,我花了几天时间试图找出它,这似乎与它的线程化方式有关 我得到的错误可

在线程操作中执行一些核心数据操作时,我遇到了很多问题

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

我得到的错误可以在这篇相关文章中看到

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

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


我还需要该上下文在保存时通知应用程序中的其他上下文,因此我观察到它是
nsmanagedobjectcontextdiddaveinnotification
通知。但是,由于在NSOperation(其他线程)中执行保存,因此通知仅在其运行的线程上发送,这是否会有问题?

您是否阅读了核心数据编程指南的一节?

您是否阅读了核心数据编程指南的一节?

对,我现在已经设法让一切都运转起来了,这让我松了一口气。经过几天的胡闹之后,我决定重写所有与线程和核心数据相关的代码,不再出现
malloc
错误。这是一个相当复杂的设置,所以一定有一些相当模糊的东西在那里

是的,我现在已经设法让一切都运转起来了,这让我松了一口气。经过几天的胡闹之后,我决定重写所有与线程和核心数据相关的代码,不再出现
malloc
错误。这是一个相当复杂的设置,所以一定有一些相当模糊的东西在那里

重新提出一个老问题,但这可能会对某些人有所帮助-我在这里描述的相同设置中遇到了类似的问题(每个NSOperation的专用上下文,一个的最大并发性),我发现这是因为我在主线程上创建了NSOperation专用上下文,然后我尝试在NSO操作线程中使用它。一旦我将上下文创建移到NSOperation的主功能中,问题就消失了。

重新提出一个旧问题,但这可能会对某些人有所帮助-我在这里描述的相同设置中遇到了类似的问题(每个NSOperation的专用上下文,最大并发一个),我发现这是因为我在主线程上创建了NSOperation专用上下文,然后我尝试在NSOperation线程中使用它。一旦我将上下文创建移到NSOperation的主功能中,问题就消失了。

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