我試圖從我的firebase數據庫下載圖像並將它們加載到collectionviewcells中。圖像下載,但我有麻煩讓他們都下載和異步加載。異步下載和緩存來自url的圖像
當前當我運行我的代碼最後圖像下載加載。但是,如果我更新數據庫,集合視圖更新和新的最後一個用戶配置文件圖像也會加載,但其餘部分不存在。
我寧願不使用第三方庫,所以任何資源或建議將不勝感激。
下面是處理下載的代碼:
func loadImageUsingCacheWithUrlString(_ urlString: String) {
self.image = nil
// checks cache
if let cachedImage = imageCache.object(forKey: urlString as NSString) as? UIImage {
self.image = cachedImage
return
}
//download
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
//error handling
if let error = error {
print(error)
return
}
DispatchQueue.main.async(execute: {
if let downloadedImage = UIImage(data: data!) {
imageCache.setObject(downloadedImage, forKey: urlString as NSString)
self.image = downloadedImage
}
})
}).resume()
}
我認爲解決之道在於重裝的CollectionView我只是不知道到底哪裏做它的地方。
有什麼建議嗎?編輯: 這裏是函數被調用的地方;我cellForItem at indexpath
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: userResultCellId, for: indexPath) as! FriendCell
let user = users[indexPath.row]
cell.nameLabel.text = user.name
if let profileImageUrl = user.profileImageUrl {
cell.profileImage.loadImageUsingCacheWithUrlString(profileImageUrl)
}
return cell
}
其他唯一的,我相信可能會影響圖像裝載的是這個功能我用它來下載用戶數據,這就是所謂的viewDidLoad
,但是其他所有的數據下載正確。
func fetchUser(){
Database.database().reference().child("users").observe(.childAdded, with: {(snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let user = User()
user.setValuesForKeys(dictionary)
self.users.append(user)
print(self.users.count)
DispatchQueue.main.async(execute: {
self.collectionView?.reloadData()
})
}
}, withCancel: nil)
}
當前的行爲:
至於當前行爲的最後一個單元是顯示下載的輪廓影像的唯一細胞;如果有5個單元格,第5個是唯一一個顯示配置文件圖像的單元格。另外當我更新數據庫,即註冊一個新用戶時,collectionview會更新並正確顯示新註冊用戶的個人資料圖像,以及正確下載圖像的最後一個單元格。然而,其餘的,沒有配置文件圖像。
你可以顯示你的CollectionViewController嗎? – javimuu
@javimuu我包括函數被調用的地方。 – Stefan
使用sdwebimage庫輕鬆加載圖像。 –