我尝试从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%的时间完全重置数据并开始正确加载帖子。
任何想法如何解决这个或可能导致这个?
答案 0 :(得分:1)
未定义集合视图和表视图向其数据源请求单元格的顺序。当您第一次显示表格视图时,通常会询问从最低部分到最高部分的单元格,以及每个部分中最低行到最高行的单元格,但您不应该这样做。我没有充分利用集合视图来了解它们通常以何种顺序获取单元格。但是,再次,订单没有定义,可能会发生变化,您不应该假设任何特定的订单。