Ios Firebase While Loop Swift 4
我正在我的一个应用程序中开发一个新页面,遇到了一个涉及Firebase和While循环的小问题。下面是我的代码:Ios Firebase While Loop Swift 4,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在我的一个应用程序中开发一个新页面,遇到了一个涉及Firebase和While循环的小问题。下面是我的代码: var user = User() var i = 0 while i < 101 { print("Print Statement 1: " + String(i)) //Correctly prints i, incrementing it by 1 every time like it should. self.ref.child("Directory")
var user = User()
var i = 0
while i < 101 {
print("Print Statement 1: " + String(i))
//Correctly prints i, incrementing it by 1 every time like it should.
self.ref.child("Directory")
.child(String(i))
.observeSingleEvent(of: .value, with: { (snapshot) in
print("Print Statement 2: " + String(i))
//Always prints 101
let nameValue = snapshot.value as? NSDictionary
if nameValue != nil {
user.id = String(i)
//Always get set to 101, and not the current value of i
}
}) { (error) in
print(error.localizedDescription)
}
i += 1
}
打印报表2:
101
101
101
101
101
etc.
这里我唯一的问题是为什么第二个print语句总是打印101而不是I的增量值。这是否与Firebase观察器在每次执行while循环时都不观察单个事件有关?还有,我能做些什么来解决这个问题
谢谢,
KPS这是因为firebase异步查询您的请求,并且打印i的完成处理程序在您的while循环完成且i的值为101时被调用
编辑:一种解决方法是使用一个单独的计数器,只有在检查值时才递增。所以,只有当结果为,并且您可以知道哪个结果为零时,才会发生变化。然而,这并不可靠,因为网络请求可能很慢且无序,但在大多数情况下应该可以工作
var user = User()
var i = 0
var counter = 0
while i < 101 {
...
self.ref.child("Directory")
.child(String(i))
.observeSingleEvent(of: .value, with: { (snapshot) in
...
let nameValue = snapshot.value as? NSDictionary
if nameValue != nil {
user.id = String(i)
// prints the item number
print(counter)
}
// increment the counter when you actually have data
counter += 1
}) { (error) in
print(error.localizedDescription)
}
i += 1
}
哦,好的,有没有一种方法可以让我在nameValue不是nil的情况下获取i的值?一种解决方法是使用一个单独的计数器,并且只有在检查值时才递增。所以,只有当结果为,并且您可以知道哪个结果为零时,才会发生变化。然而,这并不可靠,因为网络请求可能很慢且无序,但在大多数情况下应该可以工作。Shi Anushk,你能给出一个这样的代码示例吗?谢谢。很高兴它有帮助:请先接受答案;不要那样做。Firebase是异步的,而while循环的启动速度要比从internet返回数据的速度快得多。第二你想具体完成什么?Firebase中的数据仅在闭包内有效,因此这是它唯一应该使用的时间。在这种情况下,while循环将在firebase从firebase检索数据并完成一次闭包之前到达101。e、 如果你必须在一个紧密的循环中运行Firebase,那么你可能做错了。是的,这就是问题的全部。还有什么我能做的吗?我正在尝试遍历数据库中的所有项,以查看其中哪一项存在。当我找到一个已存在的变量时,我将user.id设置为已存在变量的编号,然后从nameValue变量获取所有数据并将其放入数组中。在while循环结束时添加延迟是否可以解决此问题?无需循环。只需检查节点是否存在,而不是nil。我的答案是,我不知道数据是否存储在目录/0或目录/15下,这就是为什么我试图循环遍历所有可能的目录/I目录并获取存在的目录。请将Firebase结构的快照作为文本包含,不要图像。Firebase控制台->导出JSON。同时用你要寻找的数据更新你的问题;i、 正在查找的e./目录/0/数据。此外,它会在您将目录命名为0、1、2时出现,这是一个数组。在Firebase中通常应避免使用数组,因此可能有更好的方法来构造数据。
var user = User()
var i = 0
var counter = 0
while i < 101 {
...
self.ref.child("Directory")
.child(String(i))
.observeSingleEvent(of: .value, with: { (snapshot) in
...
let nameValue = snapshot.value as? NSDictionary
if nameValue != nil {
user.id = String(i)
// prints the item number
print(counter)
}
// increment the counter when you actually have data
counter += 1
}) { (error) in
print(error.localizedDescription)
}
i += 1
}