(Firebase)从返回的完成处理函数

时间:2017-09-11 05:04:25

标签: ios swift firebase firebase-realtime-database

我有一个函数可以检索Firebase数据库的“users”节点,我正在尝试分配一个全局变量,该变量等于此“users”节点中的用户数,如下所示:

func getUsers(completionHandler:@escaping (Int) -> ()) {

    let ref = Database.database().reference().child("users")

    ref.observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {

            let user = User()

            user.id = snapshot.key
            user.setValuesForKeys(dictionary)                
            self.users.append(user)
            completionHandler(self.users.count)
        }

    }, withCancel: nil)

}

然后,在viewDidLoad()函数中,我尝试分配一个等于“users”节点中的用户数的全局变量,如下所示:

var userCount: Int?

override func viewDidLoad() {
    super.viewDidLoad()

    getUsers(){ (count) in
        self.userCount = count
    }

    print(userCount)
}

这打印为nil,应为12,这是我添加到Firebase数据库的用户数量。由于我对完成处理程序有点不熟悉,我不确定如何解决这个问题。

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:1)

您的完成关闭是@escaping因为这个原因而异步print(userCount)在完成块返回之前执行并且您将获得nil。 试试这个:

var userCount: Int?

override func viewDidLoad() {
    super.viewDidLoad()

    getUsers(){ (count) in
        self.userCount = count
        print(self.userCount)
    }
}

或者您可以删除@escaping并完成关闭同步。

func getUsers(completionHandler:(Int) -> ()) {

    let ref = Database.database().reference().child("users")

    ref.observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {

            let user = User()

            user.id = snapshot.key
            user.setValuesForKeys(dictionary)                
            self.users.append(user)
            completionHandler(self.users.count)
        }

    }, withCancel: nil)

}