как мне использовать переменную в ее собственном обработчике завершения

#ios #swift #firebase #google-cloud-firestore

#iOS #swift #firebase #google-cloud-firestore

Вопрос:

В настоящее время я пытаюсь интегрировать firebase в свое приложение для ios. И одна из функций, над которой я работаю, включает в себя создание данных в cloud firestore для каждого пользователя при регистрации. когда они нажимают «зарегистрироваться» в моем приложении, он создает нового пользователя, используя авторизацию firebase, и я создаю пользовательский документ в своей базе данных в коллекции «user». Но я также хочу добавить вложенную коллекцию для каждого пользователя, когда я создаю пользователя, который будет хранить их «друзей». вот код, в котором я создаю пользовательский документ при нажатии кнопки регистрации. Я использую функцию возврата, чтобы получить ссылку на документ, который я только что создал. Затем я хочу использовать эту ссылку для создания вложенной коллекции после создания документа, то есть при вызове обработчика завершения. Но «usersDocRef» не присваивается значение до тех пор, пока, по-видимому, не будет вызван обработчик завершения. Поэтому я не могу сделать это там. Как мне получить доступ к ссылке на документ в обработчике завершения или иным образом использовать эту ссылку для добавления вложенной коллекции после создания документа? Я пытаюсь избежать запросов на получение ссылки или любых других операций чтения, чтобы быть эффективными (потому что это линейная зависимость от стоимости выставления счетов в firebase land). Любая помощь будет оценена

 let userDocRef = self.db.collection(K.FStore.Collections.usersRootCollection).addDocument(data: [K.FStore.Fields.username : email]) { (error) in
                        if let error = error {
                            print("Error registering: (error)")
                        } else {
                            ///want to use userDocRef here (obviously can't, workarounds?)
                        }
                    }
  

Ответ №1:

Объявить userDocRef как необязательный в предыдущей строке:

 var userDocRef: DocumentReference? = nil
userDocRef = self.db.collection(K.FStore.Collections.usersRootCollection).addDocument...
  

Теперь компилятор Swift позволит вам ссылаться userDocRef изнутри обработчика завершения.

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

1. Простое решение и факт, который я хотел бы знать несколько часов назад, большое вам спасибо!

2. Это в моей книге: apeth.com/swiftBook/ch03.html#_variable_declaration