Ios 调用refreshObject时的核心数据内存峰值(对象,合并更改:否)
在对托管对象上下文调用save之后,我正在对我的对象调用Ios 调用refreshObject时的核心数据内存峰值(对象,合并更改:否),ios,core-data,magicalrecord,Ios,Core Data,Magicalrecord,在对托管对象上下文调用save之后,我正在对我的对象调用refreshObject:mergeChanges:NO,以将它们转换为错误。然而,这造成了内存使用的激增 我试图将对象转化为故障,以中断引用周期,从而释放内存 如果不调用refreshObject,我的应用程序可以运行30-40分钟,然后因为占用太多ram而被杀死。然而,如果我在每次上下文保存后调用它,那么它只会持续几分钟 这是我的核心数据堆栈: # Persistent Store Coordinator <--+-- priv
refreshObject:mergeChanges:NO
,以将它们转换为错误。然而,这造成了内存使用的激增
我试图将对象转化为故障,以中断引用周期,从而释放内存
如果不调用refreshObject
,我的应用程序可以运行30-40分钟,然后因为占用太多ram而被杀死。然而,如果我在每次上下文保存后调用它,那么它只会持续几分钟
这是我的核心数据堆栈:
# Persistent Store Coordinator <--+-- privateWriterContext (NSPrivateQueueConcurrencyType)
# |
# +----- defaultManagedObjectContext (NSMainQueueConcurrencyType) # for the main thread
# |
# +----- backgroundManagedObjectContext (NSPrivateQueueConcurrencyType) # for bg tasks
我已经阅读了其他Stackoverflow问题,其中其他人似乎成功地实现了refreshObject
:
我通过删除
performBlock和wait的所有用法来解决这个问题,并改为使用performBlock
然后,我使用NSNotificationCenter
在保存完成时发送一条消息。您只在私有上下文中刷新对象。在主线程上下文中,它们可能仍然处于活动状态(并占用内存)。主线程显示来自托管对象的数据,因此它必须将数据从持久存储加载到内存中。在主上下文的注册对象上调用refreshObject
是否有帮助?我在privateWriterContext或我的defaultManagedObjectContext上尝试了几种刷新或不刷新的组合–我可以看到注册对象的数量降到零。但它仍然只是加速了无限内存的增长。
if privateWriterContext.MR_saveToPersistentStoreAndWaitWithError(error)
privateWriterContext.performBlockAndWait(
lambda {
privateWriterContext.registeredObjects.each do |object|
privateWriterContext.refreshObject(object, mergeChanges: false)
end
}.weak!
)
else
# handle error
end