2017-10-21 33 views
0

我在从swift到firebase的查询中遇到问题。波纹管是火力点我的样本JSON:添加数据并从swift查询到firebase

Lulibvi-D220

Contas 

    -KwlPQZTqVfNhHAsFyW5 
     Nome: "Assets" 
     Numero: "1" 

    -KwlGJLUTqVfnhYHAsFyW5 
     Nome: "Liabilities" 
     Numero: "2" 

我的代码如下:

let nome: String = "Liabilities" 
    let numero: String = "2" 
    ref = Database.database().reference() 
    ref.child("Contas").child("Assets").observeSingleEvent(of: .value) { (snapshot) in 
     let numero = (snapshot.value as? NSDictionary)?["Numero"] as? String 
     print (numero as Any) 
} 

调试时,调试器只是跳转所有的代码(快照)在后并没有执行它。

我做错了什么?

感谢

回答

1

TL;博士:要调试异步代码在Xcode中,放置一个断点在完成处理程序中的第一个声明。

更详细的解释:

当你观察从火力地堡的值,它可能需要的任何时间,以获得这些数据。为防止您的程序在此期间被阻止,在代码继续时,数据将从Firebase数据库的后台加载。然后,当数据可用时,Firebase会调用您的完成处理程序。

这种模式被称为异步加载,并且几乎适用于任何现代Web API。但它可能非常难以习惯。

一个简单的方法,看看会发生什么情况是有一些很好的地方记录语句运行代码:

ref = Database.database().reference() 
print("Before attaching observer") 
ref.child("Contas").child("Assets").observeSingleEvent(of: .value) { (snapshot) in 
    print("Inside completion handler") 
} 
print("After attaching observer") 

该代码就会立即打印:

之前安装观察员

附加观察员后

然后在一段时间后(视网络速度等因素):

内完成处理

虽然有一些方法可以使代码块等待数据(见一些后下面的链接以获取更多信息),处理异步加载的更常见方法是重新构建问题。不要试图编写“首先获取数据,然后打印”,将问题的框架定义为“我们开始获取数据,每当我们获取数据时,我们都会打印它”。

将此模型化为代码的方法是,将需要访问Firebase 中的数据的所有代码移动到您的观察者的完成处理程序的中。你的代码已经通过print (numero as Any)在那里。

要在XCode中调试异步代码,请在完成处理程序中的代码上放置一个断点。当数据从Firebase返回时,该断点即会被触发。

也应对这种行为的几个问题:

+0

大......这工作!非常感谢完整的解释 –