使用集合视图和数据加载图像在刷新

时间:2017-04-02 07:14:34

标签: ios swift swift3 xcode8 collectionview

我正在创建一个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;之后从帖子中打印了一些数据。并且第一篇文章中的信息总是打印到控制台两次,而帖子中的其余数据只打印一次。奇怪的是,加载帖子时总是重复的图片总是来自第一张图片。知道为什么会这样吗?

0 个答案:

没有答案