2016-08-22 2 views
1

Ich habe Probleme, einen Prozess zu schreiben, der es einem Benutzer erlaubt, seinen Firebase-Account zu löschen, der seinen Account und alle Posts in seinem Account einschließlich Bilder löscht. Ich frage die Posts von Benutzern in der Firebase-Datenbank ab, durchblättere sie und lösche sie, sobald sie herauskommen. In der Mitte dieser Schleife rufe ich eine Funktion auf, die die Image-URL übergibt, um das Image aus dem Firebase-Speicher zu löschen. Das Problem, das ich habe, ist, dass ich wegen asynchroner Sachen kein geordnetes Ergebnis bekommen kann. Ich dachte, die Vollendungshandler würden etwas Ordnung bringen. Soll ich in Versandgruppen suchen? Jede Hilfe wird sehr geschätzt.Firebase-Abfragen und Abschluss

Der Beginn meines Verfahrens mit Anruffunktion:

  ref.deleteFirebaseDBUsersPosts(deleter) { (success) -> Void in 
      if success { 
       print("The user and their info is completely gone!") 
      } 

     } 

Funktion, die Firebase abfragt und Schleifen durch Benutzer Beiträge und löscht:

func deleteFirebaseDBUsersPosts(uid: String, completion:(success: Bool) -> Void) { 
    let usersCurrentId = uid 

    ref.child(“posts”).queryOrderedByChild("uid").queryEqualToValue("\(uid)").observeEventType(.Value, withBlock: {snapshot in 

     if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 

      for snap in snapshot{ 

       print("SNAP: \(snap)") 
       if let postedImg = snap.childSnapshotForPath("imageUrl").value { 
        let postImgUrl = postedImg as! String 
         self.deletingOldUsersImgsFromStorage(postImgUrl) { (success) -> Void in 
        } 
       } 
       let key = snap.key 
       ref.child(“posts”).child(key).removeValue() 
       ref.child(“users”).child(usersCurrentId).removeValue() 
      } 
       print("COMPLETING") 
       completion(success: true) 
     } 

    }) 
} 

das Bild von Firebase Speicher löschen :

func deletingOldUsersImgsFromStorage(postImgUrl: String!, completion:(success: Bool) -> Void) { 
    let deleteImgRef = ref.child(“images”).child("[imageNAME]") 
    deleteImgRef.deleteWithCompletion({ (error) in 
     if (error != nil) { 
      print("DEVELOPER: There was an error when trying to delete the image from Firebase Storage") 
     } else { 
      print("IMAGE SUCCESSFULLY DELETED FROM FIREBASE STORAGE") 
     } 
     completion(success: true) 
    }) 
} 

Antwort

2

Ich habe eine ähnliche Herausforderung beim Löschen eines Benutzers und seiner Daten aus Firebase behandelt. Ich behandelte es mit Versandgruppen, um den Benutzer zu löschen, nachdem meine Methoden, die ihre Daten löschten, abgeschlossen waren.

Dispatch-Gruppen sind ideal für Situationen wie diese, in denen Sie nur eine Aufgabe ausführen möchten, nachdem die anderen von Ihnen angegebenen Aufgaben abgeschlossen wurden. Hier finden Sie weitere Informationen zur Verwendung von dispatch groups.

+0

Hallo @nathan_falcone, danke für Ihre Hilfe. Das funktioniert. Ich habe mich gefragt, ob Sie wissen, ob ich die Vollendung außer Betrieb sehen sollte? Grundsätzlich sehe ich die Fertigstellung zum Löschen der Bilder aus dem Firebase Storage Drucken in meiner Konsole zuletzt, als ich die Funktion in der Mitte aufgerufen habe, wie Sie es vorgeschlagen haben. Es ist wie eine sehr verzögerte Antwort. – kelsheikh

+1

@ Kampbell411 die beiden Anrufe werden asynchron ausgeführt werden, so gibt es eine Chance, dass einer der beiden zuerst beenden konnte. Was ist gut wegen der Verwendung von Versandgruppen. Im obigen Beispiel spielt es keine Rolle, ob das Foto oder die Daten des Benutzers zuerst gelöscht werden, solange sie beide vorkommen. Sobald beide Methoden abgeschlossen sind und ihre Gruppe verlassen haben, wird die Dispatch-Benachrichtigung aufgerufen und der Benutzer aus Firebase gelöscht. –

+0

Ah ich verstehe, ich verstehe es jetzt. Danke noch einmal! @nathan_falcone – kelsheikh