在iOS 5上实现快速高效的核心数据导入
问题:如何获取子上下文以查看更改在父上下文中的持久性,以便它们触发我的NSFetchedResultsController更新UI? 设置如下: 您有一个应用程序可以下载并添加大量XML数据(大约200万条记录,每个记录的大小均与正常文本的大小相同)。.sqlite文件的大小约为500 MB。将此内容添加到Core Data需要花费时间,但是您希望用户能够在数据逐步加载到数据存储中时使用该应用程序。用户必须看不见并且无法感知大量数据在四处移动,因此不会挂起,也不会抖动:滚动像黄油一样。尽管如此,该应用程序仍然有用,它添加了更多数据,因此我们不能永远等待将数据添加到Core Data存储中。在代码中,这意味着我真的很想避免在导入代码中使用如下代码: [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; 该应用程序仅是iOS 5,因此它需要支持的最慢的设备是iPhone 3GS。 这是到目前为止我用来开发当前解决方案的资源: Apple的核心数据编程指南:有效导入数据 使用自动释放池使内存减少 关系成本。导入平面,然后在最后修补关系 不要查询您是否可以提供帮助,它会以O(n ^ 2)的速度降低速度 批量导入:保存,重置,清空和重复 关闭导入时的撤消管理器 iDeveloper TV-核心数据性能 使用3种上下文:主,主和限制上下文类型 iDeveloper TV-Mac,iPhone和iPad的核心数据更新 使用performBlock在其他队列上运行保存可以使事情变得更快。 加密会使速度变慢,如果可以,请将其关闭。 Marcus Zarra导入和显示核心数据中的大数据集 您可以通过给当前的运行循环一些时间来减慢导入速度,从而使用户感觉平稳。 示例代码证明,可以进行大量导入并保持UI响应,但是速度不如3个上下文和异步保存到磁盘的速度快。 我目前的解决方案 我有3个NSManagedObjectContext实例: masterManagedObjectContext-这是具有NSPersistentStoreCoordinator并负责保存到磁盘的上下文。我这样做是为了使我的保存可以是异步的,因此非常快。我在启动时就这样创建它: masterManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [masterManagedObjectContext setPersistentStoreCoordinator:coordinator]; mainManagedObjectContext-这是UI随处使用的上下文。它是masterManagedObjectContext的子级。我这样创建它: mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [mainManagedObjectContext …