This question already has answers here:
Swift closure not setting variable
(2个答案)
7个月前关闭。
到目前为止,我能够在用户登录后填充我的文本标签。所以一旦他们这样做了,主页上就会显示“欢迎johndoe”(johndoe是他们注册的用户名)。不过,我也有一个汉堡包样式的表视图,其中有他们的配置文件信息,其中包含他们的用户名、位置和他们的配置文件图像。在tableview中使用相同的用户名(johndoe)填充用户名时遇到问题。
我试图使用一个全局变量来保存用户名字符串,但是我一直得到默认值“No Name”
var username : String = "No Name"

    func getUserName() {

    let databaseRef = Database.database().reference()

    guard let userID = Auth.auth().currentUser?.uid else { return }

    databaseRef.child("users").child(userID).observeSingleEvent(of: .value) { (snapshot) in
        let theUserName = (snapshot.value as! NSDictionary)["nameOfUser"] as! String
        self.username = theUserName
        self.nameOfUserLabel.text! = "Welcome \(self.username)"
        //this prints out the correct label by saying "Welcome johndoe"
    }
    print("The name of the user is: \(self.username)")
    //for example it would print out in the console: "No Name"

}

通过使用username值,我试图将其分配给我的profile items表视图:
func createProfileArray() -> [ProfileItems] {
    var tempProfileItems: [ProfileItems] = []

    let profileItem = ProfileItems(profileImage: UIImage(named: "defaultUser")!, nameTitle: username, location: "Toronto")

    tempProfileItems.append(profileItem)


    return tempProfileItems
}

但是,一旦加载tableview,它只会说“没有名字”。目标是拥有与欢迎标题标签上相同的用户名。
如有任何帮助,我们将不胜感激。谢谢!

最佳答案

不能对获取名称的方法的调用是异步的(observeSingleEvent),因此请查看它执行的实际序列

guard let userID = Auth.auth().currentUser?.uid else { return } // 1

databaseRef.child("users").child(userID).observeSingleEvent(of: .value) { (snapshot) in
    let theUserName = (snapshot.value as! NSDictionary)["nameOfUser"] as! String
    self.username = theUserName
    self.nameOfUserLabel.text! = "Welcome \(self.username)" // 3
    //this prints out the correct label by saying "Welcome johndoe"
}
print("The name of the user is: \(self.username)") // 2

在完成闭包时,您将始终看到没有名字

关于swift - 从Firebase封闭返回数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55893747/

10-08 21:47