SwiftUI 列表内存问题,图像未从 RAM 中释放导致崩溃

2024-04-27

我正在将图像加载到 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(使用前将#替换为@)

SwiftUI 列表内存问题,图像未从 RAM 中释放导致崩溃 的相关文章

随机推荐

  • 为什么通过UdpClient发送会导致后续接收失败?

    我正在尝试创建一个 UDP 服务器 它可以向所有向其发送消息的客户端发送消息 真实情况要复杂一些 但最简单的方法是将其想象为一个聊天服务器 之前发送过消息的每个人都会收到其他客户端发送的所有消息 所有这一切都是通过UdpClient 在单独
  • LongListSelector 内的缓慢故事板动画

    我有一个 LongListSelector 其中填充了一些项目 每个项目都有一个子菜单 可以使用滑动动画显示或折叠该子菜单 问题是动画非常慢 具体取决于您在列表中点击的项目 开始和结束的时候很慢 中间很顺利 我怀疑每个动画帧都会使长列表选择
  • 将行添加到文件开头

    我可以使用单独的文件来执行此操作 但如何在文件的开头附加一行 f open log txt a f seek 0 get to the first position f write text f close 由于文件是以附加模式打开的 因此
  • cmake 在执行其他操作之前执行进程

    我在执行其他操作之前 CMake 执行进程时遇到问题 下面的代码片段显示了这种情况 if NOT EXISTS CMAKE CURRENT BINARY DIR generated file MAKE DIRECTORY CMAKE CUR
  • a 是什么意思? (点)在 PHP 中做什么?

    以下命令在 PHP 中执行什么操作 string string is something which I declared in the program 就其本身而言 它根本没有任何作用 它不是有效的语法 但是 如果你有这样的事情 你会看见
  • 如何通过命令行缩小/扩大 aws ecs 集群中的容器,我应该使用 aws cli 还是 ecs-cli?

    我正在使用 EC2 实例运行 AWS ECS 集群 我想要一个命令将任务扩展到 1 个正在运行的实例 然后在一段时间后 当我不需要它时 我想将其缩小到 0 这应该会破坏底层 EC2实例以避免收费 我没有使用 Fargate 因为它不属于免费
  • XML布局在android studio中不换行

    在我更新 android studio 后 布局编辑器中的 XML 格式被破坏了 最初 每个属性都位于单独的行上 然而现在有两个或三个属性占据一条线 我进入 设置 gt 编辑器 gt 代码样式 gt XML 在 布局文件 区域下 将 换行属
  • 旋转 UISplitViewController 后模态消失

    我有一个奇怪的问题 UISplitViewController 我的主视图控制器中有一个按钮 点击时会打开一个模式视图 使用简单的故事板转场 但是 当我旋转 iPad 时 模式视图会消失 但仅限于从纵向旋转到横向时 我的主视图控制器以纵向隐
  • Intellij Idea 中 Dockerfile 部署失败(未连接到 docker)

    我是 Docker 新手 只是想按照此中的说明进行操作 我创建了非常简单的 Dockerfile 但部署失败 问题是没有太多信息 Docker 已启动并正在运行 我可以从 IDE 连接到它 码头工人信息 如果您最近更改了 Docker De
  • DbContext.Entry 附加实体

    从我的研究中 我了解到调用 DbContext Entry someEntity 会自动将实体附加到上下文 然而 当我这样做时 我发现实体的状态是分离的 任何人都可以阐明这一点以及 DbContext Entry 的工作原理吗 我正在使用
  • 如何纠正 Rails 控制台命令的错误?

    当我位于 Rails 应用程序的根目录中时 我可以成功执行rails server 但是当我尝试做时rails console or rails c我收到以下错误 myrailsapp master rails c Users myuser
  • 如何从 ActionBar 中删除顶部边框阴影

    我正在开发一个新的 Android 应用程序 由于某种原因 这个新应用程序 我自己没有添加额外的代码 在操作栏上有一个顶部边框阴影 好像是我使用 Android Studio 创建新项目时默认添加的 我怎样才能有一个只有底部阴影的普通操作栏
  • 使用 Javascript(或任何客户端)绘制方程

    有没有可以用来绘制数学方程的库 最好使用 javascript 我也可以使用 Java 或者任何客户端 你看过 弗洛特 吗 http code google com p flot http code google com p flot
  • 如何在 Bluez/Linux 上从 GATT 服务器获取断开连接事件

    环境 Bluez 5 14 Linux 3 1 USB 可插拔 BLE 无线电 TI BLE 密钥卡 CC2541 开发套件 Linux 设备 USB BLE 无线电 我们使用 gatttool 启用 TI 密钥卡上的按键事件并开始监听事件
  • 如何在应用样式器功能后删除列

    应用样式器后如何删除列 这是我的样式函数 def highlight late x c1 background color red condition m x price 1 lt x price main x m2 x price 2 l
  • Android 错误:二进制 XML 文件第 16 行:添加地图片段时膨胀类片段时出错

    我正在尝试使用地图 api v2 显示地图 这是我的 xml 代码
  • d3 转换改变了哪些属性?

    我试图了解 d3 中到底发生了什么转换 例如 var bars svg selectAll null data my values enter append rect statement before transition attr x 1
  • 什么是 lub(null, Double)?

    表15 25 B http docs oracle com javase specs jls se8 html jls 15 html jls 15 25在 JLS 版本 8 中表示条件表达式的类型 true null 0 0 is lub
  • 由于 poms 中的版本发生更改,合并来自 Maven 发布分支的更改会产生冲突

    按照标准实践 我有一个用于功能开发的 svn 主干 以及一个用于构建版本的分叉分支 该分支是使用 maven 发布插件创建的 该插件也用于创建发布 碰巧的是 偶尔的错误将在分支上修复 并且这些更改需要合并回主干 为了不错过任何更改 我希望能
  • SwiftUI 列表内存问题,图像未从 RAM 中释放导致崩溃

    我正在将图像加载到 SwiftUI 列表中 当向下滚动太多图像时 RAM 会飙升并导致应用程序崩溃 为什么当用户向下滚动经过图像时图像不会被释放 我正在加载图像 如下所示 List allProducts id self product i