【问题标题】:Terminated due memory issue when fetching CoreData获取 CoreData 时因内存问题而终止
【发布时间】:2018-07-13 10:47:06
【问题描述】:

我正在尝试获取 CoreData。我知道这是很多数据,我已经在使用不同的实体来保存数据。所以基本上我只需要阅读“旧数据”。问题是当我尝试获取这些数据时,我的应用程序崩溃了,因为内存爆炸了。有人知道如何获取这些数据,也许一次只能获取一半吗?

【问题讨论】:

  • fetchLimit 属性 ?
  • 你有多少数据?你能显示堆栈跟踪吗?

标签: ios swift xcode


【解决方案1】:

我知道这是很多数据,我已经在使用不同的实体来保存数据。

我没有看到使用不同实体和内存使用之间的关系。考虑到您遵循适用于 Core Data 的内存管理规则,这根本不重要(除非您有一些奇怪的设置以及数千个关系)。

基本规则:

  • 如果您在循环中执行操作,请确保释放自动释放池。
  • 一旦不再需要 NSManagedObject 实例,并且它们的数量会对内存使用造成影响,您可以通过在上下文中调用 refreshObject:mergeChanges: 将它们变成故障。
  • 您还可以在上下文中调用 reset 以使所有获取的托管对象无效(请注意,在调用 reset 后您不应该使用这些无效对象)。
  • 注意循环引用 - 基本上,通过关系绑定的对象具有这些类型的引用,您可能需要手动将它们转换为错误/重置上下文,或者干脆完全丢弃托管对象上下文。

获取数据的提示:

  • 如果您需要获取大量数据并且有可能,请使用 Dictionary Result Type,因为 Dictionary 占用的内存远少于托管对象实例。
  • 将fetchLimit 应用于 NSFetchRequest 以限制获取的对象数量。将其与fetchOffset 结合以获得数据的“窗口”。
  • 还有 'fetchBatchSize' 需要考虑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多