【发布时间】:2012-12-29 17:19:15
【问题描述】:
我想实现一个大型数据集的 UI 响应式下载和解析,并使用 Core Data 保存它。
我的设置:
我在自定义视图控制器中显示下载的内容。我不使用 NSFetchedResultsController。
有 3 个 MOC:
- masterMOC(负责保存到磁盘,NSPrivateQueueConcurrencyType)
- mainMOC(由 UI 使用,NSMainQueueConcurrencyType,masterMOC 的子级)
- backgroundMOC(负责从 JSON 导入,在单独的线程中创建,masterMOC 的子线程)
我正在批量导入 - 每 50 件商品我通过以下方式执行 MOC 保存:
NSError *error;
[backgroundMOC save:&error];
NSManagedObjectContext *masterMOC = backgroundMOC.parentContext; //set during initialization
[masterMOC performBlock:^{
NSError *parentContextError = nil;
[masterMOC save:&parentContextError];
}];
我希望在保存 masterMOC 之后对 mainMOC 进行更改。如果我在 masterMOC 保存时尝试访问随机托管对象的某些关系(保存需要一些时间),UI 会挂起,直到保存完成。
问题:如何避免masterMOC保存时UI冻结?
【问题讨论】:
-
重读你的问题:上面的sn-p代码是在主线程还是在单独的线程中执行的?
-
我看不出使用块的好处。为什么不将
backroundMOC和masterMOC放到同一个线程中? -
到底是怎么回事?解析还是保存?您的数据是大还是复杂?我想最安全的路径应该是充分原子化数据以使提交足够短。
-
我已经实现了这里描述的方法:stackoverflow.com/questions/10542097/…。我将 masterMOC 保存在一个块中,因为它是用 NSPrivateQueueConcurrencyType 初始化的
标签: ios core-data nsmanagedobjectcontext