添加数据并从swift查询到firebase
问题描述:
我在从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)
}
调试时,调试器只是跳转所有的代码(快照)在后并没有执行它。
我做错了什么?
感谢
答
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返回时,该断点即会被触发。
也应对这种行为的几个问题:
大......这工作!非常感谢完整的解释 –