【发布时间】:2017-12-24 00:02:43
【问题描述】:
我正在尝试从我的 firebase 数据库下载图像并将它们加载到 collectionviewcells 中。图片下载,但是我无法让它们全部异步下载和加载。
目前,当我运行我的代码时,last 下载的图像会加载。但是,如果我更新我的数据库,则集合视图会更新,并且新的最后一个用户个人资料图像也会加载,但其余部分会丢失。
我不希望使用 3rd 方库,因此我们将不胜感激任何资源或建议。
这是处理下载的代码:
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 我包含了调用函数的位置。
-
使用 sdwebimage 库轻松加载图片。
-
使用 sdwebImage 库缓存图片。
-
但是异步检索机制基本上没问题(尽管我会在后台实例化
UIImage并更新缓存,并且只将self.image = image分派到主队列。)您的问题可能与此无关。当然,这个扩展有很多改进(例如,如果用户快速滚动浏览集合视图,你会看到图像闪烁,显示以前索引路径的结果,你会积压对索引路径的请求不再可见等)。但在我们着手改进之前,让我们先弄清楚当前的问题是什么。
标签: swift uiimageview uicollectionviewcell nsurl