【问题标题】:Firebase retrieves data after the function have returnedFirebase 在函数返回后检索数据
【发布时间】:2016-10-01 20:02:09
【问题描述】:

我是 swift 和 firebase 的新手,我需要一些帮助。我写了一个 swift2 函数,可以从 firebase 中检索数据,但是没有用。

代码如下:

func fetchUidWithEmail (email: String) -> String {

    var uid = ""

    ref.child("userList").queryOrderedByChild("email").queryEqualToValue(email).observeEventType(.Value, withBlock: { (snapshot) in

        if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {

            for snap in snapshots {
                uid = snap.key
            }
        }            
    })

    return uid
}

我尝试在 for 块中打印 snap,它在 uid 值返回后出现。所以我总是从这个函数返回一个空字符串。有什么方法可以解决这个问题吗?非常感谢。

【问题讨论】:

    标签: firebase swift2 firebase-realtime-database


    【解决方案1】:

    Firebase 数据库中的数据是异步读取的。这意味着您的代码执行顺序可能不是您所期望的。最简单的方法是添加一些打印语句:

    func fetchUidWithEmail (email: String) -> String {
        print("Before starting query")
        ref.child("userList").queryOrderedByChild("email").queryEqualToValue(email).observeEventType(.Value, withBlock: { (snapshot) in
            print("In query callback block")
        })
        print("After starting query")
    }
    

    当你运行这段代码时,输​​出是:

    开始查询之前

    开始查询后

    在查询回调块中

    这可能不是您所期望的。但它确实解释了为什么返回 uid 不起作用:当你返回 uid 时,它还没有从 Firebase 加载。

    解决这个问题的方法是改变你对问题的看法。与其说“先获取 uid,然后用 uid 做某事”,不如尝试将其表述为“每当我们得到 uid 时,就用它做一些事情”。

    最简单的方法是将需要 uid 的代码写入加载数据的函数中:

    func fetchUidWithEmail (email: String) -> String {    
        ref.child("userList").queryOrderedByChild("email").queryEqualToValue(email).observeEventType(.Value, withBlock: { (snapshot) in
            if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
                for snap in snapshots {
                    print(snap.key)
                    // TODO: do anything you want with the uid here
                }
            }            
        })
    }
    

    虽然这可行,但这意味着您可能有很多地方可以加载 uid-by-email。如果您可以将需要 uid 的代码传递给您的函数,则更可重用:

    func fetchUidWithEmail (email: String, withBlock: String -> Void) -> Void {
        ref.child("userList").queryOrderedByChild("email").queryEqualToValue(email).observeEventType(.Value, withBlock: { (snapshot) in
            if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
                for snap in snapshots {
                    withBlock(snap.key)
                }
            }
        })
    }
    

    然后你可以调用它:

    fetchUidWithEmail("frank.vanpuffelen@gmail.com") { (uid) in
        print(uid)
    }
    

    这正是 Firebase 数据库客户端本身的工作方式:添加观察者时,会传入回调/块。

    【讨论】:

    • 非常感谢!我不知道这种功能。你帮了我一个大忙!再次感谢您的明确答复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2020-12-07
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多