如何在托pipe对象上下文保存时避免UI冻结?

我想实现一个响应UI的下载和parsing大型数据集,并使用Core Data进行保存。

我的设置:

我在自定义视图控制器中显示下载的内容。 我不使用NSFetchedResultsController。

有3个MOC:

  1. masterMOC(负责保存到磁盘,NSPrivateQueueConcurrencyType)
  2. mainMOC(由UI使用,NSMainQueueConcurrencyType是masterMOC的子项)
  3. backgroundMOC(负责从JSON导入,在一个单独的线程中创build,masterMOC的一个子节点)

我正在批量导入 – 我按以下方式每50个项目进行MOC储存:

NSError *error; [backgroundMOC save:&error]; NSManagedObjectContext *masterMOC = backgroundMOC.parentContext; //set during initialization [masterMOC performBlock:^{ NSError *parentContextError = nil; [masterMOC save:&parentContextError]; }]; 

我希望在主MOC被保存后,主MOC中的变化。 如果在masterMOC正在保存时尝试访问某个随机pipe理对象的某个关系(保存需要一些时间),则UI将挂起,直到保存完成。

问题 :如何在masterMOC保存时避免UI冻结?

您的问题可能是数据存储在写入时被阻塞。 因此,要么使数据存储非阻塞(这可能或不可能在你的情况)或如果不可行,使访问者非阻塞。 在后一种情况下,GUI不会挂起,但它也不会更新,直到访问的结果返回。