首页 > 解决方案 > 为什么从 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 加载到图像视图。

任何帮助将不胜感激。

标签: memoryswiftuirealm

解决方案


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

但是,将这些对象投射或存储在数组中会失去这一优势,因此它们都会占用内存,压倒设备。

有关更多信息,请参阅我对这个问题的回答

有几个解决方案。

一种选择是不在数组中转换或存储领域对象,而是使用结果作为数据源。

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

第一个选项有很多优点,所以我建议将对象保留在 Results 对象中 - 它的行为非常像数组,因此我可以成为 tableViews 等的出色数据源。


推荐阅读