我正在将图像加载到 SwiftUI 列表中。当向下滚动太多图像时,RAM 会飙升并导致应用程序崩溃。为什么当用户向下滚动经过图像时图像不会被释放?
我正在加载图像,如下所示:
List(allProducts, id: \.self) { product in
Image(uiImage: UIImage(data: dataFromRealmDB[product]))
}
我的直觉告诉我,必须有一些东西可以从内存中手动释放它,所以我正在尝试以下操作。如果您如何填写该空白,请告诉我。
List(allProducts, id: \.self) { product in
Image(uiImage: UIImage(data: dataFromRealmDB[product])).onDisappear(perform: {
"WHAT SHOULD GO HERE TO MAKE THE IMAGE GET PURGED FROM RAM?"
}
}
如果我建议的解决方案不可行,也请告诉我。
UPDATE
我改变了图像的存储方式。现在它们存储在 FileManager 中,而不是保存到 RealmDB 中。这是我获取图像的功能。内存使用量仍然增加导致崩溃,SwiftUI 没有释放内存。
func getImage(link: String) -> Image? {
let lastPath = URL(string: link)?.lastPathComponent
if let dir = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) {
let image : UIImage? = UIImage(contentsOfFile: URL(fileURLWithPath: dir.absoluteString).appendingPathComponent(lastPath!).path)
if image != nil {
return Image(uiImage: UIImage(contentsOfFile: URL(fileURLWithPath: dir.absoluteString).appendingPathComponent(lastPath!).path)!)
}
}
return Image("noImg")
}
您确定这与您从数据库获取图像原始数据无关吗?根据这个问题SwiftUI 列表 https://stackoverflow.com/questions/56655421/does-the-list-in-swiftui-reuse-cells-similar-to-uitableview工作原理类似于表格视图 - 即重用单元格。
我认为您使用数据库来保存图像的原始数据这一事实会导致内存激增。
这是一种基于意见的答案,但我建议在应用程序中提前捆绑图像(如果您的业务逻辑支持它),使用数据库中的名称并按名称初始化它们。
或者远程托管它们并按需获取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)