核心数据并发

时间:2016-01-08 10:40:08

标签: ios objective-c core-data

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

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

我尝试了父/子策略,因为Apple不喜欢其他策略。但是我在executeFetchRequest上遇到了“在枚举时收集变异”的异常崩溃。在实施父/子策略后,此异常开始发生。任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

是的,我知道没有那么多博客描述项目中核心数据的有效使用,但幸运的是我找到了一个......正确地指出了你的问题......点击这里 - > https://medium.com/soundwave-stories/core-data-cffe22efe716#.3wcpw1ijo

您的异常也正在发生,因为您正在某个地方使用数据库来更新数据库以删除此异常,您可以这样做:

如果你在数组或字典中提取数据,那么就像这样改变语句

NSDictionary *myDict = [[coreDataDectionary] mutableCopy];

现在对从数据库中提取的数组或字典执行任何操作,它不会显示任何异常。 希望这会对你有所帮助。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

试试这个:

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

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

答案 3 :(得分:0)

使用此Core Data堆栈可在导入大型数据集时最小化UI锁定:

  1. 一个主要线程MOC,拥有自己的PSC。
  2. 一个背景MOC,拥有自己的PSC。
  3. 在后台MOC的保存通知中将更改合并到主线程MOC中。
  4. 是的,您可以 - 并且应该 - 使用指向同一.sqlite文件的两个独立PSC(NSPersistentStoreCoordinator)。它将整体锁定时间减少到仅SQLite锁定,从而避免PSC级锁定,因此整体UI锁定时间将为[SQLite写入锁定] + [主线程MOC读取]。

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

    批量导入。根据经验选择批量大小。每次保存后重置背景MOC。

    当处理包含数十万个对象的非常大的数据集时,不要在每次保存时使用refreshObject:mergeChanges:和主线程MOC。它很慢并且最终将消耗所有可用内存。改为重新加载你的FRC。

    关于“集合在被枚举时被突变”。 Core Data中的To-many关系是可变集,因此您必须复制,或者在迭代之前将它们更好地排序到NSArray