2017-03-15 246 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) 
    } 
}