Я преследовал это в течение двух дней, но все же я до сих пор не уверен, почему моя переменная не передается в моем segue из моего контроллера входа в контроллер просмотра чата через навигационный контроллер.Segue async Firebase данные через NavigationController (Swift)
У меня есть кнопка, которая запрашивает Firebase, проверяет, существует ли пользователь и возвращает ссылку на запрос 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.
Контроллер просмотра чата использует библиотеку JSQMessages, если это имеет значение.
Благодарим за помощь.
EDIT: Основываясь на обратной связи, я переместил super.prepare, но userRef по-прежнему не устанавливается последовательно.
ВТОРОЙ РЕДАКТИРОВАНИЕ: Следуя предложению Павла, я удалил свою кнопку. Тем не менее, мне пришлось создать еще один сегмент, который подключил контроллер просмотра для просмотра контроллера, такого как SO question.
Я переместил его, но он все еще кажется не установленным. – micyukcha
Я беру это обратно. Он прошел в 4 из 10 раз, когда я его запустил, так что происходит расовое состояние? Когда я просматриваю все свои точки останова, это выглядит так, как времена, которые прошли через точку останова внутри viewDidLoad на chatVc, задавали бы переменные. Те, которые его пропускают, этого не делают. – micyukcha
Уверены ли вы, что у вас нет раскадровки, также проводной _up_ как ваш вызов 'performSegue'? У вас должен быть тот или другой. – paulvs