Firebase在函数返回后检索数据

时间:2016-10-01 20:02:10

标签: firebase swift2 firebase-realtime-database

我是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值返回后出现。所以我总是从这个函数返回一个空字符串。有没有办法解决这个问题?非常感谢。

1 个答案:

答案 0 :(得分:0)

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数据库客户端本身的工作原理:添加观察者时,传入回调/阻止。