【发布时间】:2016-07-22 08:35:34
【问题描述】:
问题陈述
我无法异步保存服务器端数据。
结构
我正在使用以下结构的 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 线程,因为我试图执行与 Core Data 无关的操作,它们也被阻塞了。这不是持久协调器无法访问的情况)
问题
- 上述代码阻塞主线程的原因是什么?
- 假设我可以从任何地方调用上述代码,因为
save将在每个相应的线程/上下文中被调用,我是否正确?
任何帮助将不胜感激。
编辑
http://floriankugler.com/2013/04/29/concurrent-core-data-stack-performance-shootout/
显然冻结来自尝试传播到父 NSManagedObjectContext。这篇文章似乎回避了这样一个事实,即不可能将真正的异步保存到主要上下文中。
数据被高度链接,5MB,大约需要 40 秒才能保存到 psc。我不认为我会使用帖子中描述的并行结构,因为代码库已经很大了。如果我能利用任何策略来减少这种冻结,我将不胜感激。
【问题讨论】:
标签: ios objective-c multithreading core-data