Отделение от слушателя Firestore - PullRequest
0 голосов
/ 06 июня 2018

Я использую Firestore вместе со Swift.

У меня есть одноэлементный класс данных UserManager.Я вызываю это из моих разных ViewControllers, чтобы получить данные для заполнения моих табличных представлений.Я хочу, чтобы табличные представления автоматически обновлялись при обновлении коллекций, поэтому мне нужно использовать SnapshotListener.Все работает нормально, но я не уверен, как отсоединиться от слушателя, когда Viewcontroller закрыт.

В классе singleton у меня есть методы, подобные этому ниже.Метод дает список пользователей и будет вызываться из нескольких мест вокруг моего приложения.

Я также хочу вернуть ссылку на слушателя, чтобы я мог отсоединиться от него, когда Viewcontroller закрыт.Но я не могу заставить его работать.Приведенное ниже решение дает ошибку компилятора.

Я пытался посмотреть ссылку, например, здесь https://firebase.google.com/docs/firestore/query-data/listen, но мне нужно, чтобы она работала, когда данные загружаются в одноэлементный класс.непосредственно в Viewcontroller.Какой путь здесь?

В UserManager:

func allUsers(completion:@escaping ([User], ListenerRegistration?)->Void) {
    let listener = db.collection("users").addSnapshotListener { querySnapshot, error in
        if let documents = querySnapshot?.documents {
            var users = [User]()
            for document in documents {
                let user = User(snapshot: document)
                users.append(user)
            }
            completion(users, listener)
        }
    }
}

В ViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    UserManager.shared.allUsers(completion: { (users, listener) in
        self.users = users
        self.listener = listener
        self.tableView.reloadData()
    })
}

deinit {
    self.listener.remove()
}

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

I думаю ошибка компилятора, которую вы видите, связана с тем фактом, что вы используете listener в своем собственном определяющем контексте.

Попробуйте изменить:

В UserManager:

func allUsers(completion:@escaping ([User])->Void) -> ListenerRegistration? {
    return db.collection("users").addSnapshotListener { querySnapshot, error in
        if let documents = querySnapshot?.documents {
            var users = [User]()
            for document in documents {
                let user = User(snapshot: document)
                users.append(user)
            }
            completion(users)
        }
    }
}

В ViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    self.listener = UserManager.shared.allUsers(completion: { (users) in
        self.users = users
        self.tableView.reloadData()
    })
}

deinit {
    self.listener.remove()
}
0 голосов
/ 06 июня 2018

Я думаю, что getDocument вместо addSnapshotListener - это то, что вы ищете.При использовании этого метода слушатель автоматически отключается в конце запроса ... Это будет что-то похожее на

 func allUsers(completion:@escaping ([User])->Void) {
 db.collection("users").getDocument { querySnapshot, error in
     if let documents = querySnapshot?.documents {
         var users = [User]()
         for document in documents {
             let user = User(snapshot: document)
             users.append(user)
         }
         completion(users)
     }
 } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...