通过 NavigationController 连接异步 Firebase 数据 (Swift)
Segue async Firebase data through NavigationController (Swift)
我已经研究了两天了,但我仍然不确定为什么我的变量没有通过导航视图控制器从我的登录视图控制器传递到聊天视图控制器。
我有一个查询 Firebase 的按钮,检查用户是否存在以及 returns 用户的 Firebase 查询参考。然后我想在它完成时将这个 Firebase 查询引用传递给导航控制器的顶视图控制器以供使用。
在我的 IBAction 登录按钮中,我有:
var tempUserRef: FIRDatabaseReference?
channelRef.queryOrdered(byChild: "uid").queryEqual(toValue: uid).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
print("uid exist with \(snapshot.childrenCount) number of children")
for s in snapshot.children.allObjects as! [FIRDataSnapshot] {
tempUserRef = self.channelRef.child(s.key)
}
} else {
print("uid didn't exist")
if let name = self.nameField?.text { // 1
tempUserRef = self.channelRef.childByAutoId()
let channelItem = [
"name": name,
"uid": self.uid
]
tempUserRef?.setValue(channelItem)
}
}
self.userRef = tempUserRef
DispatchQueue.main.async {
self.performSegue(withIdentifier: "LoginToChat", sender: tempUserRef)
print("passsed \(self.userRef)")
}
})
这是我的转场:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if "LoginToChat" == segue.identifier {
if let navVc = segue.destination as? UINavigationController {
if let chatVc = navVc.topViewController as? ChatViewController {
chatVc.senderDisplayName = nameField?.text
if let userRef = sender as? FIRDatabaseReference {
chatVc.userRef = userRef
print("passsing \(self.userRef) to \(chatVc)")
}
}
}
}
super.prepare(for: segue, sender: sender)
}
打印语句在我的登录控制器上看起来都不错,但是当我到达聊天视图控制器时,userRef 仍然为零。所以我的感觉是我有正确的 segue 输入和切换,但是数据的异步性质在某种程度上与我的 segue 不一致。
聊天视图控制器正在使用 JSQMessages 库(如果这有所不同)。
感谢您的帮助。
编辑:
根据反馈,我移动了 super.prepare 但 userRef 的设置仍然不一致。
第二次编辑:
按照 paulvs 的建议,我删除了我的按钮 segue。但是,我确实必须创建另一个 segue,将视图控制器连接到这样的视图控制器 。
在函数末尾调用 super.prepare
。否则,将在您设置变量之前执行 segue。
我已经研究了两天了,但我仍然不确定为什么我的变量没有通过导航视图控制器从我的登录视图控制器传递到聊天视图控制器。
我有一个查询 Firebase 的按钮,检查用户是否存在以及 returns 用户的 Firebase 查询参考。然后我想在它完成时将这个 Firebase 查询引用传递给导航控制器的顶视图控制器以供使用。
在我的 IBAction 登录按钮中,我有:
var tempUserRef: FIRDatabaseReference?
channelRef.queryOrdered(byChild: "uid").queryEqual(toValue: uid).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
print("uid exist with \(snapshot.childrenCount) number of children")
for s in snapshot.children.allObjects as! [FIRDataSnapshot] {
tempUserRef = self.channelRef.child(s.key)
}
} else {
print("uid didn't exist")
if let name = self.nameField?.text { // 1
tempUserRef = self.channelRef.childByAutoId()
let channelItem = [
"name": name,
"uid": self.uid
]
tempUserRef?.setValue(channelItem)
}
}
self.userRef = tempUserRef
DispatchQueue.main.async {
self.performSegue(withIdentifier: "LoginToChat", sender: tempUserRef)
print("passsed \(self.userRef)")
}
})
这是我的转场:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if "LoginToChat" == segue.identifier {
if let navVc = segue.destination as? UINavigationController {
if let chatVc = navVc.topViewController as? ChatViewController {
chatVc.senderDisplayName = nameField?.text
if let userRef = sender as? FIRDatabaseReference {
chatVc.userRef = userRef
print("passsing \(self.userRef) to \(chatVc)")
}
}
}
}
super.prepare(for: segue, sender: sender)
}
打印语句在我的登录控制器上看起来都不错,但是当我到达聊天视图控制器时,userRef 仍然为零。所以我的感觉是我有正确的 segue 输入和切换,但是数据的异步性质在某种程度上与我的 segue 不一致。
聊天视图控制器正在使用 JSQMessages 库(如果这有所不同)。
感谢您的帮助。
编辑: 根据反馈,我移动了 super.prepare 但 userRef 的设置仍然不一致。
第二次编辑:
按照 paulvs 的建议,我删除了我的按钮 segue。但是,我确实必须创建另一个 segue,将视图控制器连接到这样的视图控制器
在函数末尾调用 super.prepare
。否则,将在您设置变量之前执行 segue。