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