2016-08-22 82 views
1

我在編寫流程時遇到了一些麻煩,允許用戶刪除他們的Firebase帳戶,從而刪除其帳戶以及他們在帳戶中包含圖片的所有帖子。我正在查詢Firebase數據庫中的用戶帖子,循環並刪除它們。在這個循環的中間,我調用了一個傳遞圖片URL的函數來從Firebase存儲中刪除圖片。我遇到的問題是由於異步內容,我無法獲得有序結果。我認爲完成處理程序會給它一些命令。我應該看看派遣組嗎?任何幫助是極大的讚賞。Firebase查詢和完成

我的過程與函數調用start:

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

     } 

功能,查詢火力地堡,並通過用戶的帖子循環和刪除:

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

    }) 
} 

從火力地堡存儲刪除圖像:

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

回答

2

從Firebase中刪除用戶及其數據時,我處理了類似的問題。我在刪除數據的方法完成後使用分派組來處理它。

func deleteUsersData(completion: (success: Bool) -> Void) {} 

func deleteUsersPhotoUrl(completion: (success: Bool) -> Void) {} 

func deleteUserFromFirebase(completion: (success: Bool) -> Void) {} 

let group = dispatch_group_create() 

dispatch_group_enter(group) 
deleteUsersData { (success) in 
    if success { 
     dispatch_group_leave(group) 
    } 
} 

dispatch_group_enter(group) 
deleteUsersPhotoUrl { (success) in 
    if success { 
     dispatch_group_leave(group) 
    } 
} 

dispatch_group_notify(group, dispatch_get_main_queue()) { 
    deleteUserFromFirebase({ (success) in 
     print("Completely deleted user from Firebase") 
    }) 
} 

調度組對於處理像這樣的情況非常適合,在這種情況下,只有在您指定的其他任務完成後才執行任務。以下是關於如何使用dispatch groups的更多信息。

+0

嗨@nathan_falcone,謝謝你的幫助。這確實有用。我想知道你是否知道我是否應該看到完成失敗?基本上,當我按照您的建議調用中間功能時,我發現從控制檯最後一次刪除Firebase存儲打印中的圖像是完成的。它像是一個非常遲緩的反應。 – kelsheikh

+1

@ kampbell411這兩個調用將會異步運行,因此有可能首先完成。由於使用派遣組這很好。在上面的例子中,只要它們都發生,用戶的照片或數據是否先被刪除並不重要。一旦兩種方法都完成並離開組,則調度通知將被調用並從Firebase中刪除用戶。 –

+0

啊,我明白了,我現在明白了。再次感謝! @nathan_falcone – kelsheikh