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

时间:2013-01-15 15:07:48

标签: ios core-data nsmanagedobjectcontext

我想实现一个响应式UI下载和解析大型数据集,并使用Core Data保存它。

我的设置:

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

有3个MOC:

  1. masterMOC(负责保存到磁盘,NSPrivateQueueConcurrencyType)
  2. mainMOC(由UI使用,NSMainQueueConcurrencyType,masterMOC的子级)
  3. backgroundMOC(负责从JSON导入,在单独的线程中创建,是masterMOC的子级)
  4. 我正在批量导入 - 我按照以下方式每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冻结?

1 个答案:

答案 0 :(得分:0)

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