'Подготовить переход' выполнить 'наблюдение' только после того, как данные будут переданы другому контроллеру представления

Я хочу разделить структуру (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 выполняется асинхронно. Поэтому вам нужно дождаться возврата снимка, прежде чем устанавливать объект в целевом контроллере представления. В качестве альтернативы вы можете передать партнерский идентификатор целевому контроллеру представления и сделать запрос Firebase, как только вы окажетесь там.

rbaldwin 01.05.2018 21:22

Если вы хотите дождаться ответа от firebase и после этого выполнить настройку, поместите код внутри наблюдателя. то есть после ut.ID = UID поместите let chatsingola = segue.destination как! ChatSingola chatsingola.aaa = ut.

Sunil luitel 02.05.2018 04:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
31
0

Другие вопросы по теме