我正在 ios 中創建一個應用程式,我使用 UITableView 和 UITableViewCell 從 api 加載影像。
由于 UITableView 重用單元格,因此當我快速滾動時會出現舊影像。為了防止這種情況,我使用系統映像(SF 符號)設定了默認映像。
我還使用快取來存盤影像的 url。
一切正常,但現在我想起來了,我每次都發送一個網路請求來檢索該 systemImage,這似乎非常低效,因為我首先使用快取來減少網路呼叫總數。
有沒有辦法解決這個問題,或者這是我必須做出的權衡?
代碼如下。
//use default image from SF symbols
let defaulticon = UIImage(systemName: "photo")?.withTintColor(.gray, renderingMode: .alwaysOriginal)
DispatchQueue.main.async {
cell.mealImage.image = defaulticon
}
guard cell.meal?.strMealThumb != nil else {
print("Category Image doesn't exist")
return
}
//use cache
if let imageData = model.imagecache.object(forKey: cell.meal!.strMealThumb as NSString) {
print("using cache")
DispatchQueue.main.async {
cell.mealImage.image = imageData
}
}
else {
let url = URL(string: cell.meal!.strMealThumb)
let session = URLSession.shared.dataTask(with: url!) { data, response, error in
if error == nil && data != nil {
let image = UIImage(data: data!)
//self.model.imagecache[cell.meal!.strMealThumb] = image
self.model.imagecache.setObject(image!, forKey: cell.meal!.strMealThumb as NSString)
DispatchQueue.main.async {
cell.mealImage.image = image
}
}
}
session.resume()
}
}
uj5u.com熱心網友回復:
覆寫此函式中的prepareForReuse方法UITableViewCell并在此函式中添加代碼,以清除可能因先前使用單元格而持續存在的未回傳資料。在您的示例中,在此函式中分配默認影像以產生更好的結果。
uj5u.com熱心網友回復:
你問:
我使用系統映像(SF 符號)設定了默認映像。
...
一切正常,但現在我想起來了,我每次都發送一個網路請求來檢索該 systemImage,這似乎非常低效,因為我首先使用快取來減少網路呼叫總數。
不,UIImage(systemName:)不發出網路請求。它本身快取影像,如檔案所述:
此方法檢查系統快取中是否有具有指定名稱的影像,并回傳該影像最適合主螢屏的變體。如果快取中還沒有匹配的影像物件,則此方法從指定的系統符號影像創建影像。系統可以隨時清除快取的影像資料以釋放記憶體。僅對快取中但當前未使用的影像進行清除。
FWIW,您可以憑經驗驗證這不會執行與網路斷開連接并嘗試使用它的網路請求。即使斷開連接,您也會看到它作業正常。
FWIW,通過保留對該著色系統映像的參考并重用它,而不是獲取快取的系統映像并重新著色,性能提升非常小(不到一毫秒?)。但性能提升微乎其微。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/323680.html
