2个不同的NSManagedObjectContexts save导致无限的内存分配

时间:2014-05-21 15:22:02

标签: ios core-data

我遇到了一个奇怪的问题。我有以下设置:

Model.xcdatamodeld

ModelBackup.xcdatamodeld

其中每个都有自己的NSManagedObjectContext NSPersistantStoreCoordinatorNSMananagedObjectModel

我可以分别成功地阅读和写入这些内容。但是,如果我在读取/写入Model的同时尝试读/写ModelBackup,我将获得无限的内存分配。在模拟器中,CPU将飙升至200%,内存将增加约80-100 MB /秒。当内存达到2.0 + GB时,这最终会崩溃。当我在这两个context save上执行NSManagedObjectContext时会发生这种情况。我可以很好地阅读/访问它们。

任何人都知道为什么我不能写这两个?

Model ConcurrencyType:NSMainQueueConcurrencyTypeModelBackup ConcurrencyType:NSPrivateQueueConcurrencyType。{/ p>

有两个不同的xcdatamodeld背后的想法是parent-child核心数据模式的变通方法/替代方法。我们的应用程序正在对datamodel进行大量更新,因此我希望有一个后台数据模型执行这些更新,然后当应用程序下次启动时,切换到新更新的sqlite。

1 个答案:

答案 0 :(得分:3)

首先,只要您注意在任何一次保存时写入磁盘的数量,您就可以与父/子进行大量更新。

其次,您可以将两个NSPersistentStoreCoordinator实例指向同一个sqlite文件,并避免使用两个文件。

第三,您的代码对于创建这些上下文有什么作用?您是否仅在-performBlock:来电中使用第二个上下文?

第四,当你停止在内存分配中间时会发生什么?你的堆栈是什么样的?

对于您的直接问题,您有一个无限循环。如果我不得不猜测我猜你正在使用NSManagedObjectContextDidSaveNotification,可能使用nil对象,并且每次保存都会启动保存到其他上下文导致循环。

查看代码有助于解决您的问题。但是我怀疑你的问题有一个更简单的解决方案。