我正在创建一个Instagram克隆,而且我遇到了一个小问题。加载配置文件页面时,我使用集合视图显示用户发布的帖子的所有图像,并按日期对这些图像进行排序。
初次加载时,经常发生的是图像无序显示。但是,当我刷新页面时,图像显示正确。因此,当加载而不是获取图像(4,3,2,1)时,我会得到类似(1,3,2,1)的内容,然后刷新并获得正确的顺序。
当我不使用sort命令时,图像始终以正确的顺序显示,但我需要先显示最新的图像。
以下是我用来观察来自Firebase的帖子数据的功能,并将它们附加到posts数组。我使用图像缓存来加载我的数据。
let posts = [Post]()
func observePosts() {
let currentUser = FIRAuth.auth()?.currentUser?.uid
let ref = FIRDatabase.database().reference().child("user-posts").child(currentUser!)
ref.observe(.childAdded, with: { (snapshot) in
let postId = snapshot.key
let postRef = FIRDatabase.database().reference().child("posts").child(postId)
postRef.observe(.value, with: { (snapshot) in
if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
let post = Post(postKey: postId, postData: postDict)
self.posts.append(post)
self.posts.sort(by: { (post1, post2) -> Bool in
return post1.createdAt! > post2.createdAt!
})
}
self.collectionView?.reloadData()
})
})
}
使用缓存加载图片:
let imageCache: NSCache<NSString, UIImage> = NSCache()
extension UIImageView {
func loadImagesUsingCacheWith(urlString: String) {
self.image = nil
//check cache for image first
if let cachedImage = imageCache.object(forKey: urlString as NSString) {
self.image = cachedImage
return
} else {
let ref = FIRStorage.storage().reference(forURL: urlString)
ref.data(withMaxSize: 2 * 1024 * 1024, completion: { (data, error) in
if error != nil {
//Handle error
} else {
if let img = UIImage(data: data!) {
self.image = img
imageCache.setObject(img, forKey: urlString as NSString)
}
}
})
}
}
}
cellForItemAt功能:
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "HomeCell", for: indexPath) as! HomeCell
let post = posts[indexPath.item]
cell.configureCell(post: post)
return cell
}
配置单元格功能
func configureCell(post: Post) {
if let imgUrl = post.imgUrl {
cellImage.loadImagesUsingCacheWith(urlString: imgUrl)
}
更新:
发生了一些非常奇怪的事情。在&#34; cellForItemAt&#34;功能,我在宣布&#34; let post = posts [indexPath.item]&#34;之后从帖子中打印了一些数据。并且第一篇文章中的信息总是打印到控制台两次,而帖子中的其余数据只打印一次。奇怪的是,加载帖子时总是重复的图片总是来自第一张图片。知道为什么会这样吗?