Как я могу удалить слушателя по завершении задачи в закрытии? - PullRequest
0 голосов
/ 17 октября 2019

В моей программе есть функция, которая присоединяет слушателя к Firestore. Я хочу удалить этот слушатель после обработки результатов внутри замыкания.

Это то, что я пробовал -

func uniqueUserName(userName : String) {


            let listener = Firestore.firestore().collection("users").whereField("userName", isEqualTo: self.userNameTextField.text!).addSnapshotListener { (snapshot, error) in

                guard let snapshot = snapshot?.documents else {fatalError()}


                if snapshot.isEmpty {
                    print("True")
                } else {
                    print("False")
                }
             }
listener.remove()
}

Когда я делаю это, действия внутри замыкания не выполняются. Я предполагаю, что это потому, что функция возвращается до завершения закрытия.

Как правильно удалить этот слушатель, только после завершения закрытия?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Если ваш слушатель просто незамедлительно отменяет регистрацию в обратном вызове, вы, вероятно, вообще не хотите, чтобы слушатель. Вместо этого используйте getDocuments () , чтобы получить результаты запроса один раз, и вам не придется беспокоиться о том, чтобы отменить регистрацию слушателей.

0 голосов
/ 17 октября 2019

Вы должны использовать getDocuments() вызов, поскольку ответ Дуга объясняет, но я также хочу показать вам, почему ваш текущий код не работает.

Сейчас вы удаляетеслушатель сразу после того, как вы прикрепите его. Поскольку получение данных с серверов (или из локального кэша) занимает некоторое время, вы удаляете прослушиватель еще до того, как эти данные станут доступны, поэтому ваш слушатель никогда не будет вызван.

Чтобы удалить прослушиватель послеобрабатывая данные, вы должны удалить их внутри обратного вызова:

func uniqueUserName (userName: String) {

let listener = Firestore.firestore().collection("users").whereField("userName", isEqualTo: self.userNameTextField.text!).addSnapshotListener(handleSnapshot)

func handleSnapshot (snapshot, error) {

    guard let snapshot = snapshot?.documents else {fatalError()}

    if snapshot.isEmpty {
        print("True")
    } else {
        print("False")
    }
    listener.remove()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...