【发布时间】:2021-08-17 00:30:36
【问题描述】:
在我的应用程序中,我使用 Firebase 实时数据库来存储有关用户的数据。我想确保当我读取这些数据以在视图中显示它(例如他们的昵称)时,在显示它之前已经完成了读取。让我解释一下:
//Initialization of user properties
static func initUsers(){
let usersref = dbRef.child("Users").child(userId!)
usersref.observeSingleEvent(of: .value) { (DataSnapshot) in
if let infos = DataSnapshot.value as? [String : Any]{
self.username = infos["username"] as! Int
//The VC is notified that the data has been recovered
let name = Notification.Name(rawValue: "dataRetrieved")
let notification = Notification(name: name)
NotificationCenter.default.post(notification)
}
}
}
这是在模型中运行并在用户登录时读取用户数据的代码。
var isFirstAppearance = true
override func viewDidLoad() {
super.viewDidLoad()
//We initialise the properties associated with the user
Users.initUsers()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if isFirstAppearance {
let name = Notification.Name(rawValue: "dataRetrieved")
NotificationCenter.default.addObserver(self, selector: #selector(registerDataToView), name: name, object: nil)
isFirstAppearance = false
}
else{
registerDataToView()
}
}
//The user's data is assigned to the view
@objc func registerDataToView(){
usernameLabel.text = String(Users.username)
}
我们在 VC 中,当视图加载时,我们在 viewDidLoad 中调用 initUsers。在 viewWillAppear 中,如果这是我们第一次加载视图,那么我们创建一个侦听器,如果数据库中的读取完成,它会调用 registerDataToView。否则我们只需调用 registerDataToView (这是在我们返回此 VC 时更新标签)。
我想知道是否有可能,例如当我们的连接非常糟糕时,侦听器不会拦截 dataRetrieved 通知,因此我的 UI 只显示默认文本?还是耳机在继续之前等待接收通知?
如果不等待,那么在初始化标签之前如何等待数据库读取完成?
感谢您的宝贵时间 :)
【问题讨论】:
标签: ios swift multithreading firebase-realtime-database