Передача данных из функции закрытия в переменную Segue

# #ios #swift #google-cloud-firestore #closures

Вопрос:

Я довольно новичок в Swift, и особенно в использовании закрытий в рамках. У меня есть следующая функция класса, которая возвращает документ из Firestore и строит модель из возвращенного документа. Я могу передать закрытие, чтобы позволить мне получить модель:

 func getUpdatedModel(callback: @escaping (AccountModel?)->Void) {
    let db = Firestore.firestore()
    let ref = db.collection("collectionName").document(self.documentId!)
 
    ref.getDocument { (document, error) in
                guard let document = document, document.exists else {
                    print("Document does not exist")
                    return
                   // callback(nil,nil)
                }
                let dataDescription = document.data()
 
      let model = AccountModel.init(dataDescription!, userId: "test")

      callback(model)
            }
    }
 

У меня есть метод загрузки сегмента, в котором я пытаюсь получить результат от этого закрытия, который будет передан в переменную сегмента для дальнейшей логики:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        self.accountModel?.getUpdatedModel() { model in
            if let error = error {
                return
            }
            
            let d = model
        }
 
        if let vc = segue.destination as? AnotherViewController {
            vc.account = d // model returned above
        }
    }
 

Кажется, я не могу сохранить результат значения, полученного в закрытии, который будет передан в мою vc.account переменную для AnotherViewController . Я также попадаю в дальнейшие проблемы, если попытаюсь сначала вызвать свой self.accountModel?.getUpdatedModel() метод, а затем вложить в if let vc = ... него логику. Я знаю, что асинхронный/ожидающий код, вызываемый из Firestore, вызывает запуск кода раньше, чем другой код в этом блоке, но я, похоже, не могу найти надлежащую технику закрытия, чтобы достичь своей цели.

Общая цель здесь состоит в том, чтобы сначала протянуть руку и захватить этот документ Firestore, затем построить модель из его содержимого, а затем вернуть эту модель, чтобы затем передать ее в ViewController, вызываемый в моем сегменте. Возможно, мне даже не понадобится использовать закрытие, насколько я знаю. Очевидно, я немного заблудился здесь и был бы признателен за любую помощь.

Комментарии:

1. вы пробовали вызвать «если позволите vc = segue. пункт назначения как? Другой контроллер просмотра {» в блоке закрытия ?, я имею в виду сразу после «пусть d = модель» …?

2. Что вы делаете с ним после того, как получите модель, возвращенную парнем «getUpdatedModel»?

3. Я могу только предположить, что наличие этого в вызове segue что-то здесь портит? Даже если я закомментирую всю vc логику, которая должна направлять отображение экрана, экран все равно загружается (так как я предполагаю, что он установлен в раскадровке) и вылетает из-за не построенной модели. Это «вещь» в Swift?

4. @Osman так что, согласно моему комментарию выше, когда я помещаю if let vc... его в закрытие, он ничего не делает. @ElTomato Я могу назначить переменную только внутри закрытия. Как я могу вернуть переменную, которая будет использоваться за пределами закрытия, которое будет использоваться позже в коде?

5. Связанный ref.getDocument с Firestore может быть асинхронным, что каким-то образом портит этот поток?