iphone - 进行核心数据迁移时内存不足

标签 iphone multithreading core-data iphone-sdk-3.0 core-data-migration

我正在应用程序的两个版本之间迁移 CoreData 模型。在之前的版本中,我将二进制数据存储为 blob,为了提高性能,我想将它们从 blob 中取出。我的问题是,在迁移过程中,核心数据似乎将所有内容加载到内存中,这导致内存不足警告,然后导致我的应用程序被终止。

Apple 文档建议如下: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmCustomizingTheProcess.html#//apple_ref/doc/uid/TP40005510-SW9

但是,它似乎依赖于大对象应用不同映射的事实。 就我而言,所有对象基本上都是相同的,并且必须对每个对象应用相同的映射。在这种情况下,我不知道如何应用他们的技术。

我应该如何处理非常大的对象的迁移?

最佳答案

我猜除了从 blob 中提取数据之外,您还需要进行一系列更改。我的建议是分几个阶段进行迁移。我在这里大声思考,所以也许可以改进这一点。这要求您使用 SQLite。

为了实现此目的,您将拥有模型的三个版本:

  1. 原始模型
  2. 删除了属性的模型(可能添加了特殊的唯一 ID - 见下文)
  3. 包含您所做的所有更改的模型,包括添加新实体和替换属性的关系

这样做的原因是从版本 1 到版本 2 的过渡应该可以通过自动轻量级迁移来完成。在这种情况下,Core Data 不需要将任何内容加载到内存中——它只是发出 SQL 语句来直接在数据库上进行更改。

因此,您首先使用旧模型版本设置持久存储协调器。加载数据后,检查要迁移的所有对象,提取二进制属性,然后以某种方式将其写入磁盘。您可以使用带有批处理和定期自动释放池耗尽的提取请求,以确保不会为临时对象使用太多内存。将数据存储到使用 NSCachesDirectory 获得的目录中。显然,您会希望以某种方式存储数据,以便将数据与对象的 ManagedObjectID 相关联。

然后,您关闭所有内容并要求 Core Data 将存储从版本 1 迁移到版本 2。请参阅 this link了解详情。使用版本 2 打开商店。

您可能需要添加一个步骤,为每个对象分配某种唯一 ID,因为我不确定 Core Data 在执行非轻量级迁移时是否维护对象 ID。如果您需要这样做,您的版本 2 模型会向您从中获取二进制数据的对象添加一个新属性,该属性是可选的或设置了默认值。由于轻量级迁移不应更改 ManagedObjectID,因此您可以将新的唯一 ID 的映射保存到两段前与二进制数据一起保存的 ManagedObjectID。

保存数据并关闭商店。

打开商店并从版本 2 迁移到版本 3,这基本上应该是您在发布问题之前已经编写的代码。商店打开后,添加您从版本 1 商店保存的所有对象,并使用您在此过程中保存的数据设置关系。

很简单吧?

关于iphone - 进行核心数据迁移时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479229/

相关文章:

iphone - 在同一后台线程上运行FMDB进程?

python - 为什么我的线程停止了?

没有happens-before关系的Java多线程

iphone - UITableViewController 内的 UIButton

ios - 在 NSURLSession 中 POST json 字符串

c++ - future 和 shared_future 有什么区别?

ios - SQLite 数据库或 CoreData Store 是否可以捆绑在 iOS 应用程序中并且仍然可以修改?

ios - 核心数据崩溃获取

objective-c - 创建时删除 NSArrayControllers selectedObjects

iPhone、CGPDF文档 - PDF 链接