繁体   English   中英

让AuthListener等到for循环结束

[英]Make AuthListener wait until for loop has finished

我在每次登录时都会读取用户的数据。 由于我在AppDelegate.swift中有一个Firebase AuthListener,因此一旦用户登录,视图就会发生变化。

问题是,在某些情况下,视图的变化速度比处理数据的速度快,导致没有所需数据的屏幕。

在过去,我通过向更改视图的代码添加: databaseRef.observeSingleEvent(of: .value, with: { snap in ... })来绕过这个:

if user != nil && currentCar == "auto auswählen" {
                databaseRef.observeSingleEvent(of: .value, with: { snap in
                    if user?.isAnonymous == false {
                        let controller = storyboard.instantiateViewController(withIdentifier: "RootPageViewController") as! RootPageViewController
                        let vc = storyboard.instantiateViewController(withIdentifier: "ProfileViewController") as! ProfileViewController
                        vc.readTimeline()
                        self.window?.rootViewController = controller
                        self.window?.makeKeyAndVisible()
                    } else if user?.isAnonymous == true {
                        let controller = storyboard.instantiateViewController(withIdentifier: "RootPageViewController") as! RootPageViewController
                        self.window?.rootViewController = controller
                        self.window?.makeKeyAndVisible()
                    }
})

这工作正常,但现在我在for循环的帮助下读取了我的数据,因为数据库请求早于for循环完成,所以不会:

databaseRef.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary

            for n in 1...snapshot.childrenCount {
                databaseRef.child("users/\(uid)").child(String(n)).observeSingleEvent(of: .value, with: { (snapshot) in
                    let value = snapshot.value as? NSDictionary

                    ...

                }) { (error) in
                    print(error.localizedDescription)
                }
            }
        }) { (error) in
            print(error.localizedDescription)
        }
    }

如何使AppDelegate.swift和AuthListener等到for循环结束?

您希望等到转到新视图,直到加载所有数据。 一种方法是计算已加载的子节点数,然后在加载所有子节点时继续。

在看起来像这样的代码中:

databaseRef.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
    let value = snapshot.value as? NSDictionary
    let loadedCount = 0

    for n in 1...snapshot.childrenCount {
        databaseRef.child("users/\(uid)").child(String(n)).observeSingleEvent(of: .value, with: { (snapshot) in
            loadedCount = loadedCount + 1
            let value = snapshot.value as? NSDictionary

            ...

            if (loadedCount == snapshot.childrenCount) {
               // TODO: all data is loaded, move to the next view
            }
        }) { (error) in
            print(error.localizedDescription)
        }
    }
}) { (error) in
    print(error.localizedDescription)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM