【问题标题】:Firebase Queries and CompletionFirebase 查询和完成
【发布时间】:2016-08-22 23:30:32
【问题描述】:

我在编写允许用户删除他们的 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)
    })
}

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    在从 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的信息。

    【讨论】:

    • 嗨@nathan_falcone,感谢您的帮助。这确实有效。我想知道你是否知道我是否应该看到无序完成?基本上,当我按照您的建议调用中间的函数时,我最后在控制台中看到从 Firebase Storage 打印中删除图像的完成。它就像一个非常延迟的响应。
    • @kampbell411 这两个调用将异步运行,因此有可能任何一个都可以先完成。这很好,因为使用了调度组。在上面的示例中,用户的照片或数据是否首先被删除并不重要,只要它们都发生即可。一旦这两种方法都完成并离开了他们的组,就会调用 dispatch notify 并将用户从 Firebase 中删除。
    • 啊,我明白了。再次感谢! @nathan_falcone
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2016-11-24
    • 2020-03-29
    • 2021-03-23
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多