细胞有时会无序加载?

时间:2016-12-09 21:30:29

标签: ios swift uicollectionview nsurlsession

我尝试从Firebase中提取按时间戳排序的数据,并将其显示在集合视图中。

以下是我使用的大部分代码:

static func loadPic(picture: String, loadSuccessBlock: @escaping (_ img: UIImage) -> Void) {
        let requested = URLRequest(url: URL(string: picture)!)

        URLSession.shared.dataTask(with: requested) {data, response, err in
            if err != nil {
                print(picture, err)
            } else {
                DispatchQueue.main.async {
                    if let imageToCache = UIImage(data: data!) {
                        MainVC.imageCache.setObject(imageToCache, forKey: picture as NSString)
                        loadSuccessBlock(imageToCache)
                    }
                }

            }

            }.resume()
    }


  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollVCCell", for: indexPath) as! CollViewCell

        let post = initiationsArray[indexPath.row]
        let picture = NSString(string: post.imageURL!)

        if let imageFromCache = MainVC.imageCache.object(forKey: picture as NSString) {
            cell.cellImage.image = imageFromCache
        } else {
            MainVC.loadPic(picture: picture as String, loadSuccessBlock: { img in
                // to prevent case of updating wrong cell
                // we request to reload cell data
                if (nil != self.collectionView.cellForItem(at: indexPath)) {

                    self.collectionView.reloadItems(at: [indexPath])
                }
            })
        }

        return cell
    }

 firstRef.queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value) { (snapshot: FIRDataSnapshot) in
            if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
                for snap in snapshots {

                secondRef.child(snap.key).observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in

                        if let dict = snapshot.value as? Dictionary<String, Any>{
                            let key = snapshot.key
                            let post = Post(postKey: key, postData: dict)

                                DispatchQueue.main.async {
                                    self.initiationsArray.insert(post, at: 0)
                                    self.collectionView.reloadData()

                            }

                        }
                    })


                }
            }

所以第一点是我如何处理从缓存中下载/拉出,第二位是我的cellForRow,第三位是我对Firebase的调用。

这使得难以调试的原因是,有时帖子是有序的,有时它们不是。通常当我完全清除所有的firebase数据并重新开始然后开始添加帖子时,它们会加载到正确的位置。当我第二天回来或者我关闭应用程序并重新加载它时,帖子通常开始在列表中随机加载或者开始插入列表的末尾......这没有任何意义,因为我明确地说要插入0。

我有100%的时间完全重置数据并开始正确加载帖子。

任何想法如何解决这个或可能导致这个?

1 个答案:

答案 0 :(得分:1)

未定义集合视图和表视图向其数据源请求单元格的顺序。当您第一次显示表格视图时,通常会询问从最低部分到最高部分的单元格,以及每个部分中最低行到最高行的单元格,但您不应该这样做。我没有充分利用集合视图来了解它们通常以何种顺序获取单元格。但是,再次,订单没有定义,可能会发生变化,您不应该假设任何特定的订单。