如何从 Firebase 同步检索数据?

Posted

技术标签:

【中文标题】如何从 Firebase 同步检索数据?【英文标题】:How to retrieve data synchronously from Firebase? 【发布时间】:2016-07-17 02:16:46 【问题描述】:

我有两个集合,即用户和问题。

基于使用 userId 登录的用户,我从 users 集合中检索 currQuestion 值。

基于currQuestion 值,我需要从Firebase Questions 集合中检索question 文档。

我使用下面的代码来检索 userId

rootRef.child("0").child("users")
        .queryOrderedByChild("userId")
        .queryEqualToValue("578ab1a0e9c2389b23a0e870")
        .observeSingleEventOfType(.Value, withBlock:  (snapshot) in

            for child in snapshot.children 
                self.currQuestion = child.value["currentQuestion"] as! Int
            
            print("Current Question is \(self.currQuestion)")

            //print(snapshot.value as! Array<AnyObject>)
        , withCancelBlock :  error in
                print(error.description)
        )

并检索问题

rootRef.child("0").child("questions")
.queryOrderedByChild("id")
.queryEqualToValue(currQuestion)
.observeSingleEventOfType(.Value, withBlock:  (snapshot) in
            for child in snapshot.children 
                print(child.value["question"] as! String)
            

            , withCancelBlock:  error in
                print(error.description)
        )

但是上面的代码是异步执行的。我需要解决方案以使此同步或如何实现侦听器,以便在更改 currQuestion 值后回火问题查询?

【问题讨论】:

使用完成块做任何你需要的事情。不要尝试同步写入 【参考方案1】:

编写您自己的方法,该方法将完成处理程序作为其参数并等待该代码块完成。像这样:

 func someMethod(completion: (Bool) -> ())
 rootRef.child("0").child("users")
    .queryOrderedByChild("userId")
    .queryEqualToValue("578ab1a0e9c2389b23a0e870")
    .observeSingleEventOfType(.Value, withBlock:  (snapshot) in

        for child in snapshot.children 
            self.currQuestion = child.value["currentQuestion"] as! Int
        
        print("Current Question is \(self.currQuestion)")
        completion(true)
        //print(snapshot.value as! Array<AnyObject>)
    , withCancelBlock :  error in
            print(error.description)
    )

然后每当你想调用那个函数时,像这样调用:

someMethod success in
if success
//Here currValue is updated. Do what you want.

else
//It is not updated and some error occurred. Do what you want.


完成处理程序通常用于等待代码块完全执行完毕。 P.S. 只要它们不阻塞主线程,异步请求就会通过添加一个完成处理程序(如上面显示的代码)来进行同步操作。

它所做的只是等待你的currValue首先被更新(从服务器接收数据async)然后当你像我展示的那样调用someMethod时,从最后也是唯一的函数 someMethod 的参数是一个闭包(也称为 trailing Closure ),您可以跳过括号并调用它。 Here 是一本关于闭包的好书。而且由于闭包的类型是 (Bool) -> (),所以您只需告诉您的 someMethod 任务何时完成,就像我的代码中的 completion(true) 一样,然后在调用它时,您使用 @987654330 调用它@ (你可以使用任何你想要的词) WILL BE 的类型是 Bool,因为它是这样声明的,然后在函数调用中使用它。希望能帮助到你。 :)

【讨论】:

你能解释一下代码的第二部分吗?或者向我指出任何解释完成处理程序的有希望的来源? 我已经编辑了我的答案来回答你的问题。如果您有不明白的地方,请随时询问。 :) 所以我有一个后续问题。我有一个应用程序,它最初使用 plist 作为它无缝工作的数据源,因为 plist 数据将在加载 UICollectionView 之前完全加载,这也是 xCode 的本机性质。我现在想利用 Firebase 作为导致问题的数据源,因为代码在从 Firebase 中提取数据时不断向前移动,因此在检索数据之前调用 UIViewController viewdidload 函数,因此当视图为空白时!在首先从 Firebase 检索数据之前,如何强制视图不加载?

以上是关于如何从 Firebase 同步检索数据?的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 提取的数据中没有出现 UITableViewCells

如何从 Firebase 检索用户数据 android

如何从以下实时数据库结构中获取检索项目?

如何从firebase数据中检索数据短片

如何从 Firebase 实时数据库中检索特定数据?

如何从 Firebase 检索图像作为布尔数据?