从Firebase数据库中获取用户数据时,我无法更新该值

时间:2019-07-27 18:39:37

标签: swift xcode firebase firebase-realtime-database

我可以从firebase中获取用户数据,但是无法将用户数据输入到全局变量中。

        Database.database().reference().child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        let username = value?["username"] as? String ?? ""
        let userDigit = value?["lastDigit"] as? String ?? ""
        let userDate = value?["babyDate"] as? String ?? ""

        print(username)
        print(userDigit)
        print(userDate)


        self.user.userName = username
        self.user.userDigit = userDigit
        self.user.userDate = userDate


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

            print(self.user.userName)
            print(self.user.userDigit)
            print(self.user.userDate)

从上面的代码中,我可以看到用户名,userDigit,userDate,但是,在将数据输入到包含3个字符串变量的用户类中之后,我无法打印用户类的值。

具体来说,
打印(self.user.userName) 此代码返回nil。

如何输入数据?

1 个答案:

答案 0 :(得分:1)

self.user.userName的值为nil,因为您是在观察者闭包之外调用它的。
在分配闭包后打印值并不能保证此后立即可用。
因为从Firebase提取数据后会调用observeSingleEvent的闭包。
从Firebase成功获取数据后,您应该修改逻辑并尝试访问user的值。
下面是一个示例代码,可以帮助您理解概念:

func getUser(with userID: String, completion: @escaping ((_ user: User) -> Void)) {
    Database.database().reference().child("users").child(userID).observeSingleEvent(of: .value) { (snapshot) in
        // Get user value
        let value = snapshot.value as? [String: Any]
        let username = value?["username"] as? String ?? ""
        let userDigit = value?["lastDigit"] as? String ?? ""
        let userDate = value?["babyDate"] as? String ?? ""

        var user = User()
        user.userName = username
        user.userDigit = userDigit
        user.userDate = userDate

        DispatchQueue.main.async {
            completion(user)
        }
    }
}

在上述方法中,我们从firebase中获取数据,并在数据可用后将其返回到我们自己的闭包中。 然后像这样调用上面的函数:

self.getUser(with: userID!) { (user) in
   // the user object inside the closure will be available after fetching data from firebase
    print(user.userName)
    print(user.userDigit)
    print(user.userDate)
}

希望这会有所帮助