带有 MagicalRecord 和 NSURLRequests 的 NSOperationQueues

Posted

技术标签:

【中文标题】带有 MagicalRecord 和 NSURLRequests 的 NSOperationQueues【英文标题】:NSOperationQueues with MagicalRecord and NSURLRequests 【发布时间】:2013-07-16 15:09:55 【问题描述】:

我对 MagicalRecord、NSOperationsQueues 和 NSURLRequests 有疑问。

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

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

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

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

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

此时我到底做错了什么?

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

[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke3 致命异常 NSGenericException * 集合 <__nscfset:> 在枚举时发生了变异。

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

-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] EXC_BAD_ACCESS

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

我正在使用最新版本的 MagicalRecord

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于带有 MagicalRecord 和 NSURLRequests 的 NSOperationQueues的主要内容,如果未能解决你的问题,请参考以下文章

带有 MagicalRecord 的 JSONModel

带有primaryRelationshipKey的MagicalRecord

带有 UITableView 示例的 MagicalRecord

带有核心数据/MagicalRecord 意外行为的 iOS 单元测试

带有 MagicalRecord 庞大数据集的 UItableView

MagicalRecord 入门