2017-12-24 4 views
0

Ich habe zwei UICollection-Ansichten auf einer Seite, die Daten zu einem Raum anzeigt. Es enthält Fotos des Raums in einer UICollection-Ansicht und eine weitere UICollection-Ansicht, die eine Liste mit Objekten in diesem Raum enthält. Es gibt einen Link, um den Raum zu bearbeiten. Wenn ein Nutzer auf den Link klickt, wechselt er zu einer anderen Ansicht, in der er sie aktualisieren kann, einschließlich zusätzlicher Fotos.Wie kann ich verhindern, dass UICollectionView doppelte Elemente nach dem Firebase-Update anzeigt?

Nachdem Sie ein Foto hinzugefügt und auf Senden geklickt haben, wird das Foto im Hintergrund in den Firebase-Speicher hochgeladen und in der Firebase-Datenbank wird der Datensatz aktualisiert, um den Namen der gerade hochgeladenen Datei zu enthalten. In der Zwischenzeit wird der Benutzer zurück in die Raumansicht geleitet.

In Firebase wird der Datensatz des Raums angezeigt, und wenn er aktualisiert wird, wird die Ansicht mit neuen Daten aktualisiert. Dies ist der Punkt, an dem das Problem auftritt. Es scheint, dass die Methode "Observe" zweimal ausgelöst wird und was schließlich passiert. In der UICollection-Ansicht, die die Bilder des Raums enthält, werden Duplikate des zuletzt hinzugefügten Fotos angezeigt.

Wenn ich zum Beispiel ein Foto zum Raum hinzufüge, erscheint dieses Foto 2x in der Sammlung. Ich habe versucht, das Array zu löschen, bevor das Array mit den Bildern aktualisiert wird, und aus meiner Analyse scheint es, dass das Array nur zwei Elemente enthält, obwohl drei in der Ansicht angezeigt werden. Ich bin mir nicht sicher, was passiert, dass das verursacht?

Here's a link to the entire file, weil ich denke, es könnte helfen.

Hier ist die loaddata() -Methode für den Fall, das ist alles, das ist wichtig:

func loadData() { 
    self.ref = Database.database().reference() 
    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true 
    guard let userID = Auth.auth().currentUser?.uid else { return } 

    let buildingRef = self.ref.child("buildings").child(userID) 

    buildingRef.keepSynced(true) 

    buildingRef.child(self.selected_building as String).observe(DataEventType.value, with: { (snapshot) in 

     let value = snapshot.value as? NSDictionary 

     if ((value) != nil) { 
      let building_id = value?["id"] as! String 
      let saved_image = value?["imageName"] as! String 
      let user_id = userID as! String 
      let destination = "/images/buildings/\(userID)/\(building_id)/" 
      let slideShowDictionary = value?["images"] as? NSDictionary 

      if ((slideShowDictionary) != nil) { 
       self.slideShowImages = [UIImage]() 
       self.slideShowCollection.reloadData() 
       var last_value = "" 
       slideShowDictionary?.forEach({ (_,value) in 
        print("are they different? \(last_value != (value as! String))") 
         if (last_value != value as! String) { 
          print("count: \(self.slideShowImages.count)") 
          print("last_value \(last_value)") 
          print("value \(value)") 
          last_value = value as! String 
          CloudStorage.instance.downloadImage(reference: destination, image_key: value as! String, completion: { (image) in 
           self.slideShowImages.append(image) 
           self.slideShowCollection.reloadData() 
          }) 

         } 
       }) 

       CloudData.instance.getBuildingById(userId: user_id, buildingId: building_id, completion: { (building) in 
        self.title = building.buildingName as String 
        self.roomsCollection.reloadData() 
       }) 
      } 
     } 
    }) 

    // User is signed in. 
    self.getRooms() 
} 

Antwort

0

Ich bin nicht ganz vertraut mit dem Firebase-API, aber wenn Sie Probleme mit der Beobachtung haben, werden würde ich folgendes vermuten:

Auslösen loadData ein zweites Mal sieht aus wie es einen zweiten Beobachtungsblock hinzufügen würde. Wie ich am besten feststellen kann, beharrt die .observe Methode wahrscheinlich auf dem Block, den sie erhält, und löst ihn bei allen Änderungen aus.

+0

lol, das war's! Ich schaute genau hinüber. . . mehrmals. Diese zusätzlichen Ladedaten luden einen zweiten Beobachter ein und so liefen zwei von ihnen zur selben Zeit. Danke!!!!!! –

Verwandte Themen