Кэшированные изображения мерцают - PullRequest
1 голос
/ 11 марта 2019

Я загружаю изображения из облачного хранилища, и они используются в моем приложении.Я их кэшировал, но я все еще вижу мерцание, когда мои таблицы прокручиваются или перезагружаются.

Вот что я пробовал:

Код моего кеша:

import UIKit

class ImageService {

    static let cache = NSCache<NSString, UIImage>()

    static func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?)->()) {
        let dataTask = URLSession.shared.dataTask(with: url) { data, responseURL, error in
            var downloadedImage: UIImage?

            downloadedImage = nil

            if let data = data {
                downloadedImage = UIImage(data: data)
            }

            if downloadedImage != nil {
                cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
            }

            DispatchQueue.main.async {
                completion(downloadedImage)
            }
        }

        dataTask.resume()
    }

    static func getImage(withURL url:URL, completion: @escaping (_ image:UIImage?)->()) {
        if let image = cache.object(forKey: url.absoluteString as NSString) {
            print("IMAGE IS LOADED FROM CACHE!!!!")
            DispatchQueue.main.async {
                completion(image)
            }
        } else {
            print("IMAGE IS LOADED FROM DOWNLOAD!!!!")
            downloadImage(withURL: url, completion: completion)
        }
    }
}

А вот пример в одной из моих таблиц:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    cell.imageView.image = nil

    let storage = Storage.storage()
    let storageRef = storage.reference()
    let imageRef = storageRef.child(String(format: "images/%@.jpg", id))

    imageRef.downloadURL { (URL, error) in
        if error == nil {
            DispatchQueue.main.async {
                ImageService.getImage(withURL: URL!, completion: { image in
                   cell.imageView.image = image
              })
           }
        } else {
          cell.imageView.image = UIImage (named: "placeholder")
        }
    }
}

Я вижу, что при первой загрузке приложения загружаются изображения, а затем они загружаются из кэша.Но я все еще вижу их мерцание.Любые предложения обновить вышеперечисленное либо для кэширования в памяти и на диске, либо для устранения проблемы мерцания?

Решение:

Я использую FirebaseUI с модифицированной версиейSDWebImage для кэширования на основе ссылки на хранилище.

Ответы [ 2 ]

1 голос
/ 11 марта 2019

TBH Я не знаю, будет ли это работать.Но у меня была такая же проблема, где-то вы должны установить для cell.imageview значение nil

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// cell.imageView.image = nil (remove)

let storage = Storage.storage()
let storageRef = storage.reference()
let imageRef = storageRef.child(String(format: "images/%@.jpg", id))

imageRef.downloadURL { (URL, error) in
    if error == nil {
        DispatchQueue.main.async {

            ImageService.getImage(withURL: URL!, completion: { image in
               cell.imageView.image = nil //add
               cell.imageView.image = image
          })
       }
    } else {
      cell.imageView.image = nil // Add
      cell.imageView.image = UIImage (named: "placeholder")
    }
}
}
0 голосов
/ 11 марта 2019

Вы должны взять следующие строки из метода делегата UITableView.

let storage = Storage.storage()
let storageRef = storage.reference()

И сделать их переменными класса.

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