gpt4 book ai didi

ios - (Firebase) 从返回的完成处理程序函数中为全局变量赋值

转载 作者:行者123 更新时间:2023-11-28 06:12:28 25 4
gpt4 key购买 nike

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

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() 函数中,我尝试在“用户”节点中分配一个等于用户数的全局变量,如下所示:

var userCount: Int?

override func viewDidLoad() {
super.viewDidLoad()

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

print(userCount)
}

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

非常感谢任何帮助。

最佳答案

你的完成闭包是 @escaping 因为这个原因是异步的 print(userCount) 在完成 block 返回之前执行并且你得到 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)

}

关于ios - (Firebase) 从返回的完成处理程序函数中为全局变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46148480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com