Ios Firebase查询和完成

Ios Firebase查询和完成,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我在编写一个允许用户删除Firebase帐户的过程时遇到了一些问题,该过程会删除他们的帐户以及他们帐户中的所有帖子,包括图片。我正在查询Firebase数据库中的用户帖子,在它们出现时循环浏览并删除它们。在这个循环的中间,我调用在图像URL中传递的函数,以从FialBasic存储中删除图像。我遇到的问题是,由于异步的原因,我无法得到有序的结果。我认为有完成处理程序会给它一些命令。我应该调查调度组吗?非常感谢您的帮助 使用函数调用开始我的进程: ref.deleteFirebas

我在编写一个允许用户删除Firebase帐户的过程时遇到了一些问题,该过程会删除他们的帐户以及他们帐户中的所有帖子,包括图片。我正在查询Firebase数据库中的用户帖子,在它们出现时循环浏览并删除它们。在这个循环的中间,我调用在图像URL中传递的函数,以从FialBasic存储中删除图像。我遇到的问题是,由于异步的原因,我无法得到有序的结果。我认为有完成处理程序会给它一些命令。我应该调查调度组吗?非常感谢您的帮助

使用函数调用开始我的进程:

         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并循环用户发布和删除的函数:

         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存储中删除图像:

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

调度组非常适合处理这样的情况,即您只希望在指定的其他任务完成后执行任务。这里有更多关于如何使用的信息。

嗨@nathan_falcone,谢谢你的帮助。这确实有效。我想知道你是否知道我是否应该看到完工时出现故障?基本上,我看到了在我的控制台上从FielBaseCudioDebug中删除图像的完成,当我像您所建议的那样在中间调用函数时。这就像是一个非常延迟的响应。@kampbell411这两个调用将异步运行,因此有可能其中一个可以先完成。因为使用了调度组,所以这很好。在上面的示例中,用户的照片或数据是否首先被删除并不重要,只要它们都发生了。一旦这两种方法都完成并离开了它们的组,就会调用dispatch notify并从Firebase中删除用户。啊,我明白了,我现在明白了。再次感谢@内森·法尔肯