调用刷新对象(对象,合并更改:否)时核心数据存储器峰值



在托管对象上下文上调用 save 后,我正在对对象调用 refreshObject:mergeChanges:NO 以将它们变成错误。但是,这会导致内存使用量激增。

我试图将对象变成错误,以打破引用周期,以便释放内存。

如果不调用refreshObject我的应用程序能够运行 30-40 分钟,然后因消耗过多内存而被杀死。但是,如果我在每次上下文保存后调用它,那么它只会持续几分钟。

这是我的核心数据堆栈:

# Persistent Store Coordinator <--+-- privateWriterContext (NSPrivateQueueConcurrencyType)
#                                            |
#                                            +----- defaultManagedObjectContext (NSMainQueueConcurrencyType) # for the main thread
#                                                   |
#                                                   +----- backgroundManagedObjectContext (NSPrivateQueueConcurrencyType) # for bg tasks

这是我用来持久然后刷新对象的代码

if privateWriterContext.MR_saveToPersistentStoreAndWaitWithError(error)
    privateWriterContext.performBlockAndWait(
      lambda {
        privateWriterContext.registeredObjects.each do |object|
          privateWriterContext.refreshObject(object, mergeChanges: false)
        end
      }.weak!
    )
else
  # handle error
end

我已经阅读了其他Stackoverflow问题,其他人似乎已经成功地实现了refreshObject

  • 核心数据 - 打破父上下文的保留周期
  • 导入大型数据集时的核心数据存储使用情况

这是 Apple 对象生存期管理文档的相关片段:

在托管对象之间建立关系时,每个对象都维护对与其相关的一个或多个对象的强引用。这可能会导致强参考周期。若要确保引用循环被中断,在完成对象处理后,可以使用托管对象上下文方法 refreshObject:mergeChanges: 将其转换为错误。

我通过删除performBlockAndWait的所有用法并改用performBlock来解决此问题。

然后,我使用 NSNotificationCenter 在保存完成后发送消息。

最新更新