带有 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。我在NSOperationQueue
的start
方法中设置了[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的主要内容,如果未能解决你的问题,请参考以下文章
带有primaryRelationshipKey的MagicalRecord
带有 UITableView 示例的 MagicalRecord
带有核心数据/MagicalRecord 意外行为的 iOS 单元测试