ios - Firebase 查询和完成

标签 ios swift firebase firebase-realtime-database

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

我的流程以函数调用开始:

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

        }

查询 Firebase 并循环遍历用户发布和删除的函数:

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

    })
}

从 Firebase 存储中删除图像:

 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 的更多信息.

关于ios - Firebase 查询和完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39080684/

相关文章:

swift - 当另一个模块在 Swift 中具有具有自己名称的类型时,引用另一个模块中与当前模块中的类型同名的类型

ios - Angularfire2 FirebaseListObservable 在 iOS 上加载缓慢

javascript - 当 ref 路径不再可用时如何删除 firebase 数据库监听器

ios - iOS:打开具有已填充日期的“日历”应用“新事件”屏幕

ios - ARC 语义问题 - 没有可见的@interface

swift - 转换为 Swift 替代品不起作用

ios - 将视频裁剪为框架

facebook - Firebase 规则 - 限制拥有用户的访问权限

iOS 在启用缩放(捏合和双击)的情况下全屏显示 UIImage

ios - 未定义不是对象(评估“RCTToastAndroid.SHORT”)