Я хочу разделить структуру (Utente
) между двумя контроллерами с помощью перехода, поэтому я написал этот код. Проблема в том, что часть ref.observe
выполняется только после того, как переменная ut
передается в другое представление. Точнее, все инструкции выполняются в правильном порядке, в какой-то момент Xcode переходит к инструкциям let chatsingola = segue.destination as! ChatSingola; chatsingola.aaa = ut
и передает данные другому контроллеру представления, а после этого повторяет все инструкции, в том числе и ref.observe
.
Почему так работает? Как я могу решить эту проблему?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let indexPath = tableView.indexPathForSelectedRow{
let selectedRow = indexPath.row
let msg = Messaggi[selectedRow]
let partnerID: String
var ut = Utente()
if msg.Mittente == Auth.auth().currentUser?.uid {
partnerID = msg.Destinatario!
}
else {
partnerID = msg.Mittente!
}
print("PARTNER:\n",partnerID)
let ref = Database.database().reference().child("Utenti").child(partnerID)
//Retrieve the user
ref.observe(.value) { (snapshot) in
//print(snapshot)
if let Diz = snapshot.value as? [String: AnyObject] {
let nome = Diz["Nome"] as? String
let email = Diz["Email"] as? String
let immProfilo = Diz["immProfilo"] as? String
let UID = partnerID
ut.nome = nome
ut.email = email
ut.immProfilo = immProfilo
ut.ID = UID
print("UT1:\n",ut)
}
}
print("UT2:\n",ut)
let chatsingola = segue.destination as! ChatSingola
chatsingola.aaa = ut
}
}
Если вы хотите дождаться ответа от firebase и после этого выполнить настройку, поместите код внутри наблюдателя. то есть после ut.ID = UID поместите let chatsingola = segue.destination как! ChatSingola chatsingola.aaa = ut.
Это потому, что запрос Firebase выполняется асинхронно. Поэтому вам нужно дождаться возврата снимка, прежде чем устанавливать объект в целевом контроллере представления. В качестве альтернативы вы можете передать партнерский идентификатор целевому контроллеру представления и сделать запрос Firebase, как только вы окажетесь там.