簡體   English   中英

NSCache無法正常工作,無法從緩存加載圖像

[英]NSCache Not Working Properly , Not Able To Load Images From Cache

由於NSCache已更改為通用類型NSCache,現在這是我正在執行的代碼段,控制台正在打印-“將圖像緩存后”並調度主隊列CustomImageView,但是未顯示來自緩存執行的圖像! ! 也許它沒有被存儲在我創建的緩存中! 有幫助嗎? 將不勝感激

let imageCache = NSCache<AnyObject, AnyObject>()

類CustomImageView:UIImageView {var imageURLString:字符串?

func loadImageUsingURlString(urlString: String)
{
    imageURLString = urlString

    let url = URL(string: urlString)

    image = nil
    if let imageFromCache = imageCache.object(forKey: urlString as AnyObject ) as? UIImage
    {
        self.image = imageFromCache
        print("Image From Cache Executed")
        return
    }



    URLSession.shared.dataTask(with: url!, completionHandler:
    {
        (data, response, error) in

        if error != nil
        {
            print(error ?? "loadImageUsingURlString | Class : Helpers -> CustomImageView")
            return
        }

        DispatchQueue.main.async
        {
            let imageToCache = UIImage(data: data!)
            print("After Image To Cache")


            if self.imageURLString == urlString
            {
                print("Dispatch Main Queue CustomImageView[![enter image description here][1]][1]")
                self.image = imageToCache

            }
            else
            {
                        imageCache.setObject(imageToCache!, forKey: urlString as AnyObject)
            }



        }

    }).resume()
}

}

首先:

let imageCache = NSCache<AnyObject, AnyObject>()為什么您在這里使用AnyObject而不是您使用的類型StringUIImage 您有不必要的代碼強制轉換。

再想一想:

if self.imageURLString == urlString
            {
                print("Dispatch Main Queue CustomImageView[![enter image description here][1]][1]")
                self.image = imageToCache

            }
            else
            {
                        imageCache.setObject(imageToCache!, forKey: urlString as AnyObject)
            }

如果網址匹配,則您不緩存圖像。 您應該刪除else並保留imageCache.setObject(imageToCache!, forKey: urlString as AnyObject)在異步調用之后始終執行。

順便說一句,請始終使用更好的開發人員已編寫和測試的代碼:)試試這個: Kingfisher

我認為if self.imageURLString == urlString條件不是必需的,請您嘗試以下代碼,它對我來說是完美的嗎?

let imageCache = NSCache<NSString, UIImage>()

extension UIImageView {

    func loadImageCacheWithUrlString(urlString: String) {

        if let cachedImage = imageCache.object(forKey: urlString as NSString){
            self.image = cachedImage
            return
        }

        URLSession.shared.dataTask(with: URL(string: urlString)!) { (data, response, error) in
            if error != nil {
                return
            }
            DispatchQueue.main.async {
                if let downloadedImage = UIImage(data: data!) {
                    imageCache.setObject(downloadedImage, forKey: urlString as NSString)
                    self.image = downloadedImage
                }
            }
            }.resume()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM