我一直在做一個加載大量圖片的應用程式。我有一個表視圖單元格,其中每個單元格都有一個圖片。 圖片被存盤在S3桶中。 每張圖片都非常大,大約 720 KB,每次我滾動螢屏時都會停頓一下以獲得整個圖片。
以下是我獲取圖片的代碼
let url: String = "(K.baseURLForImage)(cellImageURL)"
let validURL = URL(string: url)。
if let imageData = try? Data(contentsOf: validURL! ) {
let image = UIImage(data: imageData)
cell.cellImage.image = image
}
當然,這不是很好,那么有沒有什么方法可以讓我繞過這個問題呢?
我聽說不使用dequeueReusableCell是不好的
預先感謝你。
編輯
我添加了這幾行
if let validURL = URL(string: url){
任務 = URLSession.shared.dataTaskPublisher(for: validURL)
.sink(receiveCompletion: { completion in.
//錯誤處理。
print(" failed URL: '(url)'")
}, receiveValue: { (data, response) in
影像 = UIImage(data: data)
})
return image
} else {
return nil ?
}
但我每次呼叫這個函式時都得到nil。
我檢查了圖片的URL是否有效。
uj5u.com熱心網友回復:
如上所述,Data(contentsOf:)是一個阻塞呼叫,任何被呼叫的執行緒上的活動都將被停止,包括從主執行緒呼叫的情況。
切換到使用URLSession函式之一。
一個可能的例子:
import Combine
let url = "https://via.placeholder.com/150"/span>
var task: AnyCancellable? ///在資料加載前不要讓它超出范圍。
if let validURL = URL(string: url){
任務 = URLSession.shared.dataTaskPublisher(for: validURL)
.sink(receiveCompletion: { completion in.
//錯誤處理。
}, receiveValue: { (資料,回應)in
let image = UIImage(data: data)
cell.cellImage.image = image
})
}
uj5u.com熱心網友回復:
我用Kingfisher解決了我的問題!
下面是我的代碼
import Kingfisher
let url: String = "some url"
let validURL = URL(string: url)
KF.url(validURL! )
.set(to: cell.cellImage)
return cell
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/311711.html
標籤:
