Firebase查询和完成

问题描述:

我在编写流程时遇到了一些麻烦,允许用户删除他们的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) 
    }) 
} 

从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