IOS核心数据异步节约

问题描述:

问题陈述

我有麻烦保存服务器端数据异步IOS核心数据异步节约

结构

我使用的NSManagedObjectContext以下结构的父母为了孩子:

  1. writerManagedObjectContext(NSPrivateQueueConcurrencyType)
  2. masterManagedObjectContext(NSMainQueueConcurrencyType)
  3. backgroundManagedObjectContext(NSPrivateQueueConcurrencyType)

我使用下面的代码保存数据

[backgroundManagedObjectContext performBlock:^{ 
    [backgroundManagedObjectContext save:nil]; 
    [masterManagedObjectContext performBlock:^{ // Starts blocking UI from here 
     [masterManagedObjectContext save:nil]; 
     [writerManagedObjectContext performBlock:^{ 
      [writerManagedObjectContext save:nil]; 
     }] 
    }] 
}] 

问题

代码节省精码。 backgroundManagedObjectContext也异步保存。但是,masterManagedObjectContextwriterManagedObjectContext都拒绝异步保存并阻止UI线程。 (我知道它会阻止UI线程,因为我尝试执行里面什么都没有做与核心数据的行为,他们也被*,这不是不是持续协调访问的情况下)

问题

  1. 上述代码阻塞主线程的原因是什么?
  2. 我是否正确假设我可以从任何地方调用上述代码,因为save将在每个相应的线程/上下文中调用?

任何帮助将不胜感激。

编辑

http://floriankugler.com/2013/04/29/concurrent-core-data-stack-performance-shootout/

显然冻结来源于试图传播到父的NSManagedObjectContext。这篇文章似乎避免了这样一个事实,即不可能对主要上下文进行真正的异步保存。

数据被严重链接,5MB,大约需要40s才能保存到psc。我不认为我会使用后面描述的并行结构,因为代码库已经很大。我将不胜感激任何可以用来减少这种冻结的策略。

即使backgroundManagedObjectContext是一个私有队列上下文,它仍然传播其变化高达masterManagedObjectContext,作为其父母。这可能是它窒息的地方。合并来自子上下文的更改仍然占用CPU时间,其效果在像UI这样的繁忙队列中变得更加明显。

您可以随时使用乐器来分析正在发生的事情。

如果您的特定使用案例允许,请尝试将backgroundManagedObjectContext.persistentStoreCoordinator设置为与writerManagedObjectContext相同的psc,而不是使其成为masterManagedObjectContext的子项。

更好的是,使用像MagicalRecord这样的真棒框架。不会让你远离这样的问题,但更少的代码使得事情(可以说)更容易调试。

+0

我已经在使用结构所示的嵌套MOC。我的问题是为什么尽管使用嵌套的MOC结构保存不是异步的。 – jrhee17

+0

我意识到你在重新阅读你的文章后使用了嵌套的上下文。我会编辑我的答案。您应该避免将'nil'传递给'save'错误处理程序。你会希望能够对错误做出反应。尝试检查错误,看看是否拖延你的主队列。你也提到'服务器端'。您正在使用Core Data iCloud同步吗? – jp2g

+0

我使用自己的服务器,但老实说服务器是无关的。基本上我解析json数据并将它们插入到Core Data中。我在做错误处理 - 上面的代码只是为了说明我的代码是什么样的。 – jrhee17