gpt4 book ai didi

ios - 调用 refreshObject 时核心数据内存峰值(对象,mergeChanges : NO)

转载 作者:行者123 更新时间:2023-11-29 12:30:12 25 4
gpt4 key购买 nike

在我对托管对象上下文调用保存之后,我正在对我的对象调用 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's Object Lifetime Management documentation 的相关片段:

When you have relationships between managed objects, each object maintains a strong reference to the object or objects to which it is related. This can cause strong reference cycles. To ensure that reference cycles are broken, when you're finished with an object you can use the managed object context method refreshObject:mergeChanges: to turn it into a fault.

最佳答案

我通过删除所有 performBlockAndWait 的使用并改用 performBlock 来解决这个问题。

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

关于ios - 调用 refreshObject 时核心数据内存峰值(对象,mergeChanges : NO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911876/

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