提问者:小点点

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


我想实现一个UI响应的大型数据集的下载和解析,用核心数据保存它。

我的设置:

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

有 3 个 MOC:

  1. masterMOC(负责保存到磁盘,NSPrivateQueueConcurrencyType)
  2. mainMOC(由UI,NSMainQueueConcurrencyType使用,masterMOC的子级)
  3. 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];
}];

我希望在主MOC被保存后,主MOC会有所改变。如果我试图在masterMOC保存时访问一个随机管理对象的一些关系(保存需要一些时间),UI会挂起,直到保存完成。

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


共1个答案

匿名用户

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