首页 文章

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

提问于
浏览
1

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

var userCount: Int?

override func viewDidLoad() {
    super.viewDidLoad()

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

    print(userCount)
}

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

非常感谢任何和所有的帮助 .

1 回答

  • 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)
    
    }
    

相关问题