2017-03-15 245 views
2

好的,我的文本标签应显示用户的名称,但代码在用户数据获取之前运行,并且数据加载时标签不会更改。加载firebase数据时重新加载视图控制器swift

第一次我打印的用户名我得到零,但是当我在Firebase调用中打印时,我得到了用户名。我该如何做到这一点,所以我不必在Firebase调用中更改标签?

var ref: FIRDatabaseReference! 
var user: User! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    ref = FIRDatabase.database().reference() 

    fetchUser() 

    self.titleLabel.text = user?.name 

    // Returns nil 
    print(user?.name) 
} 

func fetchUser() { 

    ref.child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in 

     let value = snapshot.value as? NSDictionary 

     let name = value?["name"] as? String ?? "" 
     let birthdate = value?["birthdate"] as? String ?? "" 
     let gender = value?["gender"] as? String ?? "" 

     self.user = User(name: name, birthdate: birthdate, gender: gender) 

     // Now i get the users name 
     print(self.user.name) 

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

回答

2

如果您不想从fetchUser访问标签,则可以使用简单回调。

override func viewDidLoad() { 
    //viewDidLoad code 

    fetchUser() { 
     self.titleLabel.text = user?.name 
    } 

} 

func fetchUser(_ completion: @escaping() -> Void) { 

    ref.child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in 
     //fetchUser code 

     // Now i get the users name 
     print(self.user.name) 
     completion() 

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