【问题标题】:I cannot update the value when I fetch the user data from firebase database从 firebase 数据库中获取用户数据时无法更新值
【发布时间】:2019-12-05 16:27:55
【问题描述】:

我可以从 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。

如何输入数据?

【问题讨论】:

  • 你初始化user对象了吗?
  • 是的,我这样做了,var user = User()

标签: swift xcode firebase firebase-realtime-database


【解决方案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
   // the user object can even be assigned to a global property
    self.globalUser = user
    print(self.globalUser.userName)
    print(self.globalUser.userDigit)
    print(self.globalUser.userDate)
}

希望对你有帮助

【讨论】:

  • 您好,非常感谢您的帮助!但我只是想知道是否有一种方法可以将用户名输入到全局变量中?具体来说,var globalUser = User()self.getUser(with: userID!) { (user) in globalUser = user } 还是 globalUser 是一个 nil 对象
  • 是的,你可以做到。但是在控件到达getUser 中的闭包后,globalUser 将不会是nil。我已经相应地更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2020-02-27
  • 2017-10-13
  • 2021-10-25
  • 1970-01-01
  • 2023-04-02
  • 2021-04-28
相关资源
最近更新 更多