我面临的情况是我需要将一个可能很大(20.000+)的数据集导入核心数据。从JSON格式的Web服务检索数据。至于导入它是一个简单的更新或创建类型的东西,也代表一个层次结构,所以对于每个实体我设置一个父实体(当然除了顶层)。目前,该过程运行速度太慢,可能占用大量内存。所以我必须优化,并且我对这方面的最佳实践有疑问。
首先,我使用一个带有子NSManagedObjectContext
的单独线程进行导入,这样我的UI线程就不会卡住。基本原则是工作。
首先,我想分批处理数据。可能最好的解决方案是仅解析对象的一部分JSON答案,然后处理它们。然后,我将实现https://developer.apple.com/library/mac/DOCUMENTATION/Cocoa/Conceptual/CoreData/Articles/cdImporting.html中描述的查找或创建效率。
我的问题是:
批量大小是多少? 1000?
由于我需要为每个实体找到并设置一个父实体,我的方法是在没有父实体处理批处理后的第二次迭代中执行此操作。这样我也可以为父母进行批量获取。这是一个好主意/是否有更好的方法?
在每个批次之后,我将重置子MOC并保存在父moc中。这够了吗?我需要做更多吗?
[self.childmoc reset];
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self.moc save];
});
目前我通过AFNetworking加载数据,AFNetworking能够自动进行JSON解析。重构什么是将收到的答案拆分成单独的文件(每个批处理)而不破坏json对象的最佳方法? AFNetworking使用什么JSON解析器(AFJSONResponseSerializer)?我也可以在加载文件时使用它吗?
特别需要注意的任何陷阱?
感谢您的帮助!
答案 0 :(得分:1)
这只是我的两分钱,但是您的问题并不是将数据导入Core Data,而是将其导入到Core Data正在抽象的数据存储中。
考虑到这一点,您可能还有其他选择,具体取决于您的特定用例(例如,如果您的数据是在首次启动时导入的),例如:
只是一个想法...