2016-12-09 2 views
0

Я пытаюсь извлечь данные из 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% случаев я полностью сбрасываю свои данные и начинаю новую загрузку сообщений правильно.

Любые идеи, как исправить это или что может быть причиной этого?

ответ

1

Порядок, в котором виды коллекции и представления таблиц запрашивают источники данных для ячеек, не определены. Когда вы сначала показываете вид таблицы, то обычно запрашивает ячейки от младшей секции до самой высокой секции и от младшей строки до самой высокой строки в каждом разделе, но вы не должны этого допускать. Я не играл с представлениями коллекции, чтобы узнать, в каком порядке они обычно берут ячейки. Опять же, порядок не определен и может быть изменен, и вы не должны принимать какой-либо конкретный порядок.

+0

Я полностью забыл на самом деле сортировать информацию. Я забыл, что вы не можете просто полагаться на firebase, чтобы отсортировать его для вас. self.theArray.sort (by: {$ 0.timeStamp!> $ 1.timeStamp!}) сделал трюк. – user6820041

+0

Ах. Ну, это совсем другое дело. –

Смежные вопросы