如何检索数据同步从 Firebase 吗?

标签: ios Swift
发布时间: 2017/3/6 23:36:43
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

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

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

我使用以下代码来检索用户 Id

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:

在完成编写您自己的方法以 handler 作为其参数,等着那块的代码来完成。就像这样︰

 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.只要他们不阻塞主线程,异步请求由采取同步添加完成 handler 喜欢上面所示的代码。

它只是做的是等待你 currValue 第一次更新 (接收数据 async 从服务器),然后当你调用 someMethod 像我展示如何,和自最后的和函数的唯一参数 someMethod 是一个封闭 (又名,尾随关闭),你可以跳过括号并调用它。这里一个好读关于闭包。关闭是因为 type (Bool)-> (),你只是告诉你 someMethod 当任务完成时是做像 completion(true) 在我的代码,然后调用它时,你叫它与 success (你可以使用任何你想要的词) 的哪些 type Bool作为它宣布像这样,然后在函数调用中使用它。希望它能帮助。:)

赞助商