Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Firebase While Loop Swift 4_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios Firebase While Loop Swift 4

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")

我正在我的一个应用程序中开发一个新页面,遇到了一个涉及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")
    .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

}