首页 > 解决方案 > Swift - 在不缓存的情况下加载 PNG

问题描述

我正在构建一个使用一些图像的游戏,并将它们加载到 UIImageViews 中。通过进行一些测试,我意识到当我加载图像时内存会增加,但当我从超级视图中删除 UIImageView 时不会减少。

示例:
- 初始内存:50mb
- 然后我在许多 UIImageViews 中加载一些图像(在 UIView 内)
- 内存达到大约 70mb
- 从超级视图中删除所有 UIImageViews,然后删除 UIView
- 内存保持 70mb

似乎加载的 PNG(在这种情况下,我使用资产来存储所有这些)保留在内存/缓存中,并且仅在应用程序关闭时“解除缓存”。

我该如何解决这个问题?当应用程序达到 70-80mb 左右时,应用程序开始变慢,非常令人沮丧。

标签: swiftimagecaching

解决方案


您可以使用此代码,它不会将图像存储在缓存中

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)
    }


}

推荐阅读