快速加载firebase数据时重新加载视图控制器

时间:2017-03-15 18:39:48

标签: ios swift firebase firebase-realtime-database

好的,所以我的文本标签应该显示用户的名字,但代码在获取用户数据之前运行,并且标签在加载数据时不会改变。

我第一次打印用户名时我得到了nil,但是当我在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)
    }
}

1 个答案:

答案 0 :(得分: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)
    }
}