2016-01-08 170 views
0

我想得到一些建议,使我的项目中的核心数据操作并发。我的项目自两年以来一直运行,因此它有许多实现可以根据objectiveC中新功能的可用性进行优化。主要是,我正在寻找优化CoreData操作。核心数据并发性

目前大部分的数据操作都是使用主管理对象上下文完成的。最近,我实现了一项新功能,可以在登录后使用核心数据下载大量数据并插入数据库。这应该与应用程序中的其他操作并行执行。现在我意识到为核心数据编写的代码正在主线程中执行,因为应用程序的UI在coredata操作期间被阻塞。因此,我提到了许多博客,并且知道有两种策略可以实现核心数据并发性,即借助多个上下文和父/子托管对象上下文进行通知。

我试过父母/孩子的策略,因为苹果不喜欢其他策略。但我在executeFetchRequest上遇到了随机崩溃,例外情况是“Collection在枚举时发生了变化”。在实施父/子策略之后,这种异常开始发生。任何人都可以帮我解决这个问题吗?

回答

0

是的,我知道有没有描述高效利用核心数据的项目,但幸运的是,我发现一个如此众多的博客......这正确指向您的问题...看看这里 - >https://medium.com/soundwave-stories/core-data-cffe22efe716#.3wcpw1ijo

也您的例外发生,因为你正在更新你的数据库,同时正在某处用它来消除这种异常,你可以做到这一点,如:

如果您在数组或字典中获取数据,然后做的更改语句这样

NSDictionary *myDict = [[coreDataDectionary] mutableCopy]; 

现在对您从数据库中获取的数组或字典执行任何操作,但不会显示任何异常。 希望这可以帮助你。

0

您应该在您的代码中使用completionBlock。 here是教程和解释。 即使您的下载没有完成,它也将允许您不冻结您的UI应用程序。即使代码块中的代码尚未完成,代码的执行也会继续。下载结束后,块内会有回调动作。

0

试试这个:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{ 
    // DATA PROCESSING 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // UPDATE UI 
    }); 
} 
0

使用此核心数据堆栈导入大型数据集时,尽量减少UI锁:

有自己的PSC
  1. 一个主线程MOC。
  2. 一个具有自己的PSC的背景MOC。
  3. 将背景MOC的保存通知合并到主线程MOC中。

是的,你可以 - 也应该 - 使用两个独立的PSC(NSPersistentStoreCoordinator)指向相同的.sqlite文件。它会将整体锁定时间缩短到仅锁定SQLite,避免PSC级别的锁定,因此整体UI锁定时间将为[SQLite写入锁定] + [主线程MOC读取]。

您可以在后台线程中使用后台MOC,或者在NSOperation以内更好 - 我发现处理数据并在同一线程上将其提供给Core Data非常方便。

分批进口。凭经验选择批量大小。每次保存后重置背景MOC。

当处理非常大的数据集时,数十万个对象在每次保存时都不要使用refreshObject:mergeChanges:和主线程MOC。速度很慢,最终会消耗所有可用内存。请重新加载您的FRC。

而关于“集合被枚举时变异”。核心数据中的多对多关系是可变集合,因此您必须在迭代之前进行复制或更好地将它们排序为NSArray