1

我对 MagicalRecord、NSOperationsQueues 和 NSURLRequests 有疑问。

我得到了一个模型,它通过 MagicalRecord 处理从 CoreData 获取数据。那工作正常,但我希望有一个后台进程来通过我的 API 从网络通过 NSURLRequest 获取数据。这是主要问题。我必须scheduleInRunLoop:forModeNSURLConnection[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

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

我想通过 MagicalRecord 将获取的资源保存到 CoreData。我在我的方法中设置了我[NSManagedObjectContext MR_contextForCurrentThread]start方法NSOperationQueue来处理来自 NSOperationQueue 的当前线程中的保存。

我现在面临的主要问题是我[self.localContent MR_saveToPersistentStoreWithCompletion:]使用完成块调用以等待 CoreData 将其保存到 PersistentStore。

但此时永远不会调用完成块,我无法更新我的 NSOperationQueue 以完成。

在这一点上我到底做错了什么?

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

[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke3 致命异常 NSGenericException * Collection <__NSCFSet: 0x1d0490c0> 在枚举时发生了突变。

NSOperation 低优先级并发限制队列 Crashed

-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] EXC_BAD_ACCESS

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

我正在使用最新版本的 MagicalRecord

4

1 回答 1

0

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

于 2013-07-20T18:22:02.573 回答