gpt4 book ai didi

iphone - NSManagedObjectContext 批量保存限制

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:11:03 28 4
gpt4 key购买 nike

我目前正在使用 CoreData 开发 iOS 应用。

当应用首次启动时,会针对 RESTful 网络服务发出一系列网络请求。

Web 服务提供一系列 json 响应,其中可以包含超过 2000 条记录。

然后对这些记录进行解析,将其转换为各种核心数据实体并存储在我们的 SQLite 持久存储中。

此操作完成后,我们通过获取实体 A 中的所有行(例如)创建一个对象图,并创建一个我们稍后使用的对象图。

出于某种原因,在遍历存储在实体 A 中的所有 NSManagedObject 时,一些 NSManagedObject 缺少属性值。

鉴于我们在多线程环境中工作,我们确保在单独的线程上创建单独的 managedObjectContexts - 然而,在我们最近的测试运行期间,我们配置了环境,使得只有一个线程一次从 SQLite 持久性存储中保存/检索数据。

可能还值得注意的是,在我们解析了所有 2000 多条记录之前,我们不会执行 [context save:...] 操作返回一个 json 响应。

经过一些尝试和错误后,我注意到问题消失了,我们在每次插入时都执行保存。

例如,下面的代码可以正常工作:

NSManagedObjectContext *context = ...
NSError *error = ...

for(id record in collectionOfRecords){
//create entity for insertion
[context save:&error]
}

但这会导致属性值缺失的问题:

NSManagedObjectContext *context = ...
NSError *error = ...

for(id record in collectionOfRecords){
//create entity for insertion
}
[context save:&error]

问题:

在必须执行 [NSManagedObjectContext save:...] 操作之前,内存中的 NSManagedObjects 是否有最大数量?

最佳答案

按要求回答您的问题:在需要保存之前,内存中可以容纳多少托管对象没有设置限制。您的应用程序可以创建托管对象而无需尽可能多地保存,当内存不足时,您将开始收到任何 iOS 应用程序都会收到的正常内存警告。理想情况下,您不希望发生这种情况,并且执行上下文保存或上下文重置以响应内存警告可能也不是一个好主意。

但是,您在详细信息中描述的场景包含在 Apple 的文档中:

Core Data Programming Guide: Efficiently Importing Data

这里还有更多相关内容:

Core Data Programming Guide: Core Data Performance

在您的情况下,您应该更频繁地进行保存,并且在多个线程上进行工作 - 您说您只从一个线程访问存储,这可能是您问题的很大一部分。您似乎没有在线程 B 的上下文中从线程 A 的上下文中获取更改 - NSManagedObjectContextObjectsDidChangeNotification 是使用旧线程限制模型时执行此操作的主要方法。

关于iphone - NSManagedObjectContext 批量保存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15484407/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com