[英]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
而不是您使用的類型String
和UIImage
。 您有不必要的代碼強制轉換。
再想一想:
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.