memory - 为什么从 Realm DB 加载图像时 SwiftUI List 会崩溃?RAM 达到极限
问题描述
我已将大约 7000 张图像保存到 Realm DB 中,以便可以离线查看。除了加载很长的 SwiftUI 列表外,该应用程序运行良好。我相信当用户向下滚动时,所有图像都存储在 RAM 上,因为在测试时我实际上可以看到 RAM 增加。问题是,如果列表中有足够的图像,RAM 就会变满并且应用程序崩溃。
他们声称 SwiftUI List 就像 UITableView 可重用单元格,那么为什么它不为列表中过去的图像释放内存呢?
List(searchResults(results: results), id: \.self) { product in
ScrollView(.horizontal) {
HStack{
ForEach(0...imageListGetter().count - 1, id: \.self) {i in
imageListGetter()[i]
}}}
//each image is added like this to the list, they are stored as Data into Realm DB and then passed as uiImage to SwiftUI Image
imageList.append(Image(uiImage: UIImage(data: imageLocation1.data!)!)
我将图像作为数据保存到领域,并将它们作为 uiImage 加载到图像视图。
任何帮助将不胜感激。
解决方案
Realm 对象是延迟加载的,这意味着数千个对象的 RAM 占用空间很小。
但是,将这些对象投射或存储在数组中会失去这一优势,因此它们都会占用内存,压倒设备。
有关更多信息,请参阅我对这个问题的回答
有几个解决方案。
一种选择是不在数组中转换或存储领域对象,而是使用结果作为数据源。
如果您必须将数据存储在数组中,另一种选择是使用分页并一次加载较少量的数据。
第一个选项有很多优点,所以我建议将对象保留在 Results 对象中 - 它的行为非常像数组,因此我可以成为 tableViews 等的出色数据源。
推荐阅读
- youtube-data-api - 尝试检索播放列表:列表端点,使用服务帐户
- applescript - 获取 Applescript 中某个选项卡的窗口
- google-cloud-platform - 我每 15 分钟收到一次文件。我应该在作曲家中使用云功能还是文件传感器来触发 DAG?
- c# - C# - 将字符串转换为浮点数组并忽略特殊字符
- python - 为什么我的帮助命令不起作用?我不觉得有什么不对
- sql - 如何根据列值将一行拆分为两行
- javascript - 如何在php中查找二维数组中元素的所有重复项?
- greasemonkey - Greasemonkey - 浏览器重定向
- javascript - Exceljs:“我们发现 'filename.xlsx' 中的某些内容存在问题。”
- python - Python 读取 csv 文件时出现错误:_csv.Error: line contains NULL byte