IOS核心数据异步节约
问题陈述
我有麻烦保存服务器端数据异步。IOS核心数据异步节约
结构
我使用的NSManagedObjectContext以下结构的父母为了孩子:
- writerManagedObjectContext(NSPrivateQueueConcurrencyType)
- masterManagedObjectContext(NSMainQueueConcurrencyType)
- backgroundManagedObjectContext(NSPrivateQueueConcurrencyType)
我使用下面的代码保存数据
[backgroundManagedObjectContext performBlock:^{
[backgroundManagedObjectContext save:nil];
[masterManagedObjectContext performBlock:^{ // Starts blocking UI from here
[masterManagedObjectContext save:nil];
[writerManagedObjectContext performBlock:^{
[writerManagedObjectContext save:nil];
}]
}]
}]
问题
代码节省精码。 backgroundManagedObjectContext
也异步保存。但是,masterManagedObjectContext
和writerManagedObjectContext
都拒绝异步保存并阻止UI线程。 (我知道它会阻止UI线程,因为我尝试执行里面什么都没有做与核心数据的行为,他们也被封锁,这不是不是持续协调访问的情况下)
问题
- 上述代码阻塞主线程的原因是什么?
- 我是否正确假设我可以从任何地方调用上述代码,因为
save
将在每个相应的线程/上下文中调用?
任何帮助将不胜感激。
编辑
http://floriankugler.com/2013/04/29/concurrent-core-data-stack-performance-shootout/
显然冻结来源于试图传播到父的NSManagedObjectContext。这篇文章似乎避免了这样一个事实,即不可能对主要上下文进行真正的异步保存。
数据被严重链接,5MB,大约需要40s才能保存到psc。我不认为我会使用后面描述的并行结构,因为代码库已经很大。我将不胜感激任何可以用来减少这种冻结的策略。
即使backgroundManagedObjectContext
是一个私有队列上下文,它仍然传播其变化高达masterManagedObjectContext
,作为其父母。这可能是它窒息的地方。合并来自子上下文的更改仍然占用CPU时间,其效果在像UI这样的繁忙队列中变得更加明显。
您可以随时使用乐器来分析正在发生的事情。
如果您的特定使用案例允许,请尝试将backgroundManagedObjectContext.persistentStoreCoordinator
设置为与writerManagedObjectContext
相同的psc,而不是使其成为masterManagedObjectContext
的子项。
更好的是,使用像MagicalRecord这样的真棒框架。不会让你远离这样的问题,但更少的代码使得事情(可以说)更容易调试。
我已经在使用结构所示的嵌套MOC。我的问题是为什么尽管使用嵌套的MOC结构保存不是异步的。 – jrhee17
我意识到你在重新阅读你的文章后使用了嵌套的上下文。我会编辑我的答案。您应该避免将'nil'传递给'save'错误处理程序。你会希望能够对错误做出反应。尝试检查错误,看看是否拖延你的主队列。你也提到'服务器端'。您正在使用Core Data iCloud同步吗? – jp2g
我使用自己的服务器,但老实说服务器是无关的。基本上我解析json数据并将它们插入到Core Data中。我在做错误处理 - 上面的代码只是为了说明我的代码是什么样的。 – jrhee17