Swift - загрузить PNG без кеширования - PullRequest
0 голосов
/ 06 мая 2018

Я создаю игру, в которой используются некоторые изображения, и загружаю их в UIImageViews. Проведя несколько тестов, я понял, что память увеличивается при загрузке изображений, но не уменьшается при удалении UIImageView из superview.

Пример:
- начальная память: 50 МБ
- затем я загружаю некоторые изображения во многие UIImageViews (которые находятся внутри UIView)
- память уходит примерно до 70мб
- удалить все UIImageViews из суперпредставления, а затем удалить UIView
- память хранит 70мб

Похоже, что загруженный PNG (в данном случае я использую ресурсы для хранения всех их) хранится в памяти / кэшируется, и только "decache", когда приложение закрывается.

Как я могу решить это? Когда приложение достигает 70-80 МБ, оно начинает работать медленнее, и это очень расстраивает.

1 Ответ

0 голосов
/ 06 мая 2018

Вы можете использовать этот код, он не будет хранить изображение в кеше

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


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...