NSOperationQueues与MagicalRecord和NSURLRequests

时间:2013-07-16 15:09:56

标签: multithreading core-data nsurlrequest nsoperationqueue magicalrecord

我遇到了MagicalRecord,NSOperationsQueues和NSURLRequests的问题。

我有一个Model,它通过MagicalRecord处理来自CoreData的数据提取。这很好,但我希望有一个后台进程通过我的API从网上通过NSURLRequest获取数据。这是主要问题。我必须将scheduleInRunLoop:forMode上的NSURLConnection设置为[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

从我的模型到NSOperationQueue的回调现在由主线程处理,一切正常。

我想通过MagicalRecord将获取的资源保存到CoreData。我在[NSManagedObjectContext MR_contextForCurrentThread]的{​​{1}}方法中设置start来处理来自NSOperationQueue的当前帖子中的保存。

我现在面临的主要问题是我使用完成块调用NSOperationQueue以等待CoreData将其保存到PersistentStore。

但是在这一点上永远不会调用完成块,我无法更新我的NSOperationQueue来完成。

此时我究竟做错了什么?

如果我将它保存在defaultContext中,我的应用程序会随机崩溃并使用以下语句:

  

[的NSManagedObjectContext(MagicalSaves)   MR_saveWithOptions:completion:] _ block_invoke3致命异常   NSGenericException    * 集合< __ NSCFSet:0x1d0490c0>在被列举时被突变。

     

NSOperation低优先级并发限制队列崩溃

     

- [NSManagedObjectContext(_NSInternalChangeProcessing)_processRecentChanges:]    EXC_BAD_ACCESS

我知道这是因为在相同的上下文中访问并保存了相同的时间,但我没有想到解决这个问题。

我正在使用最新版本的MagicalRecord

1 个答案:

答案 0 :(得分:0)

从你有限的描述和缺乏实际代码,我所能提供的是你从另一个线程改变你的集合。最有可能的是,您有多个NSoperation使用完全相同的数据集,并且还共享相同的托管对象上下文。当一个线程保存时,上下文在一个线程上更新,从而将集合标记为已修改。然后另一个线程进入,下一次访问会触发此错误。您需要确定一次触发的操作数量,确保所有操作都有一个上下文,并且您不会为所有操作共享一个上下文。