我有一个函数可以检索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数据库的用户数量。由于我对完成处理程序有点不熟悉,我不确定如何解决这个问题。
非常感谢任何和所有帮助。
答案 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)
}