2016-12-09 2 views
0

Ich versuche, Daten aus Firebase sortiert nach Zeitstempel zu ziehen und in einer Sammlungsansicht anzuzeigen.Zellen werden manchmal außer Betrieb geladen?

Hier ist die meiste Code Ich verwende:

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() 

          } 

         } 
        }) 


       } 
      } 

Also das erste Bit ist, wie ich das Herunterladen bin Handhabung/Ziehen aus dem Cache, sind zweiter Bit meine cellForRow und dritte Bit ist mein Anruf zu Firebase.

Was macht es schwer zu debuggen ist, dass manchmal die Beiträge in Ordnung sind, und manchmal sind sie nicht. Normalerweise, wenn ich alle meine Firebase-Daten vollständig gelöscht habe und neu starte und dann mit dem Hinzufügen von Posts beginne, laden sie sich an der richtigen Position ein. Wenn ich am nächsten Tag zurückkomme oder die App schließe und neu lade, beginnen die Posts normalerweise entweder zufällig in der Liste oder beginnen am Ende der Liste einzufügen ... was nicht sinnvoll ist, weil ich ' m ausdrücklich zu sagen, um 0 einzufügen.

100% der Zeit, die ich vollständig zurückgesetzt meine Daten und neu starten die Posts korrekt laden obwohl.

Irgendwelche Ideen, wie man das behebt oder was könnte das verursachen?

Antwort

1

Die Reihenfolge, in der Sammlungsansichten und Tabellenansichten ihre Datenquellen für Zellen anfragen, ist nicht definiert. Wenn Sie zuerst eine Tabellenansicht anzeigen, fragt sie normalerweise fragt Zellen vom untersten Abschnitt zum höchsten Abschnitt und der niedrigsten Zeile zur höchsten Zeile in jedem Abschnitt, aber Sie sollten nicht davon ausgehen. Ich habe nicht genug mit Auflistungsansichten gespielt, um zu wissen, in welcher Reihenfolge sie normalerweise Zellen abrufen. Auch hier ist die Reihenfolge nicht definiert und kann sich ändern, und Sie sollten keine bestimmte Reihenfolge annehmen.

+0

Ich habe total vergessen, die Informationen tatsächlich zu sortieren. Ich habe vergessen, dass du dich nicht einfach auf den Firebase verlassen kannst, um es für dich zu sortieren. self.theArray.sort (by: {$ 0.timeStamp!> $ 1.timeStamp!}) hat es geschafft. – user6820041

+0

Ah. Nun, das ist eine andere Sache. –

Verwandte Themen