swift - Swift - 在不缓存的情况下加载 PNG
问题描述
我正在构建一个使用一些图像的游戏,并将它们加载到 UIImageViews 中。通过进行一些测试,我意识到当我加载图像时内存会增加,但当我从超级视图中删除 UIImageView 时不会减少。
示例:
- 初始内存:50mb
- 然后我在许多 UIImageViews 中加载一些图像(在 UIView 内)
- 内存达到大约 70mb
- 从超级视图中删除所有 UIImageViews,然后删除 UIView
- 内存保持 70mb
似乎加载的 PNG(在这种情况下,我使用资产来存储所有这些)保留在内存/缓存中,并且仅在应用程序关闭时“解除缓存”。
我该如何解决这个问题?当应用程序达到 70-80mb 左右时,应用程序开始变慢,非常令人沮丧。
解决方案
您可以使用此代码,它不会将图像存储在缓存中
extension UIImageView {
func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleToFill) {
contentMode = mode
URLSession.shared.dataTask(with: url) { data, response, error in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() {
self.image = image
}
}.resume()
}
func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleToFill ) {
guard let url = URL(string: link) else { return }
downloadedFrom(url: url, contentMode: mode)
}
func downloadimageFrom(url: URL, contentMode mode: UIViewContentMode = .scaleToFill) {
contentMode = mode
URLSession.shared.dataTask(with: url) { data, response, error in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() {
self.image = image
}
}.resume()
}
func downloadimageFrom(link: String, contentMode mode: UIViewContentMode = .scaleToFill ) {
guard let url = URL(string: link) else { return }
downloadimageFrom(url: url, contentMode: mode)
}
}
推荐阅读
- azure - 我需要更改 Azure 应用服务中的哪些设置以允许在 App_Offline 中使用 base64 图像?
- ssh - ssh:连接到主机 4.12.678.96 端口 22:操作超时
- r - 如果另一列中的值在列表中,则更改一列中的值 [R]
- regex - 如何在powershell中按时间戳对文本数据进行排序
- java - 如果在 java 中选择了 JComboBox 中的某个项目,有没有办法删除 JTextFiled?
- ios - Swift - 在 UITableView 中向 UIButton 添加目标不起作用
- spring-boot - 使用 build.gradle 中 application.yml 文件中的值
- excel - Excel 频率与 IF 和
- javascript - 需要正则表达式帮助:模式几乎可以工作
- sql - SQL案例 | 如果
然后