# #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 может быть асинхронным, что каким-то образом портит этот поток?