ios - 核心数据:导入大型数据集

标签 ios objective-c core-data import

我面临这样一种情况,我需要将一个可能很大 (20.000+) 的数据集导入到核心数据中。数据以 JSON 格式从 Web 服务中检索。至于导入,它是一种简单的更新或创建的东西,也代表了一个层次结构,所以对于每个实体我都设置了一个父实体(当然顶级实体除外)。目前该进程运行速度太慢,可能占用了太多内存。所以我必须进行优化,并且我对这样做的最佳实践有疑问。

首先,我使用一个带有子 NSManagedObjectContext 的单独线程进行导入,这样我的 UI 线程就不会卡住。基本原理是有效的。

首先我想批量处理数据。可能最好的解决方案是只解析对象的一部分 JSON 答案,然后处理它们。然后我将实现 https://developer.apple.com/library/mac/DOCUMENTATION/Cocoa/Conceptual/CoreData/Articles/cdImporting.html 中描述的查找或创建效率.

我的问题是:

  • 好的批量大小是多少? 1000?

  • 由于我需要为每个实体查找并设置一个父实体,我的方法是在没有父实体的情况下处理该批处理后,在第二次迭代中执行此操作。这样我也可以为 parent 进行批量提取。这是个好主意/有更好的方法吗?

  • 在每批处理之后,我都会重置子 MOC 并保存在父 moc 中。这够了吗?我需要做更多吗?

    [self.childmoc reset];
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self.moc save];
    });
    
  • 目前我通过 AFNetworking 加载数据,它能够自动解析 JSON。重构时,在不破坏 json 对象的情况下,将收到的答案拆分为单独的文件(每个文件一批)的最佳方法是什么? AFNetworking 使用什么 JSON 解析器 (AFJSONResponseSerializer)?我也可以在加载文件时使用它吗?

  • 有什么需要特别注意的陷阱吗?

感谢您的帮助!

最佳答案

这只是我的两分钱,但您的问题不是将数据导入 Core Data,而是将其导入 Core Data 抽象的数据存储。

考虑到这一点,您可能有其他选择,具体取决于您的特定用例(例如,如果您的数据是在首次启动时导入的),例如:

  • 不使用 Core Data 进行导入,而是直接使用 sqlite。然后在完成后(重新)初始化核心数据堆栈
  • 如果您控制该服务并且它不是一个公共(public) API,则可能会添加一个端点,让您可以直接在种子 .sqlite 文件中进行流式传输。尽管如果您需要进行创建或更新,那可能不是最好的主意。同样,这取决于您的用例。

只是一个想法...

关于ios - 核心数据:导入大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23539079/

相关文章:

ios - MKMapView 显示错误保存的区域

ios - xcode 静态库 public/private/project 头文件

iphone - drawRect 不反射(reflect)对图层所做的更改

iphone - 如何重命名目录?

ios - 由于错误代码 1580,Swift Coredata 无法保存

ios - 如何使用 CFData/NSData 在 Core Data 中存储 CFBitVector(或任何 CFType)?

ios - 如何根据文本标签长度动态设置表格单元格高度?

iphone - 使用相同的按钮播放/暂停 [AVAudioPlayer]

swift - UITableView CoreData - 排序描​​述符不影响标题

ios - NSFetchedResultsController didChangeObject 带有过滤 NSPredicate