Я пытаюсь извлечь данные из 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.
Что делает это трудным для отладки, так это то, что иногда сообщения в порядке, а иногда и нет. Обычно, когда я полностью очищаю все данные своей базы данных и начинаю свежие, а затем начинаю добавлять сообщения, они загружаются в правильное положение. Когда я вернусь на следующий день или я закрываю приложение и перезагружаю его, сообщения обычно начинают загружаться либо случайно в списке, либо начинать вставку в конце списка .., что не имеет смысла, m, явно заявив, что вставить на 0.
В 100% случаев я полностью сбрасываю свои данные и начинаю новую загрузку сообщений правильно.
Любые идеи, как исправить это или что может быть причиной этого?
Я полностью забыл на самом деле сортировать информацию. Я забыл, что вы не можете просто полагаться на firebase, чтобы отсортировать его для вас. self.theArray.sort (by: {$ 0.timeStamp!> $ 1.timeStamp!}) сделал трюк. – user6820041
Ах. Ну, это совсем другое дело. –