为什么 SwiftUI List 在从 Realm DB 加载图像时崩溃?内存达到极限

Why SwiftUI List crashes when loading images from Realm DB? RAM reaches limit

我已经将大约 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!)!)

我正在将图像作为数据保存到 Realm,并将它们作为 uiImage 加载到图像视图。

任何帮助将不胜感激。

Realm 对象是延迟加载的,这意味着数千个对象占用的 RAM 很小。

但是,将这些对象转换为数组或将这些对象存储在数组中会失去这一优势,因此它们都会占用内存,使设备不堪重负。

查看我对 的回答以了解更多相关信息

有几个解决方案。

一个选项是不将 Realm 对象转换或存储在数组中,而是使用结果作为数据源。

如果必须将数据存储在数组中,另一种选择是使用分页并一次加载较少量的数据。

第一个选项有很多优点,所以我建议将对象留在结果对象中 - 它的行为非常像一个数组,所以我可以成为 tableView 等的一个很好的数据源。