从Firestore侦听器中分离

时间:2018-06-06 09:19:52

标签: ios swift firebase google-cloud-firestore

我和Swift一起使用Firestore。

我有一个单例数据类UserManager。我从不同的ViewControllers中调用它来获取数据来填充我的tableviews。我希望tableviews在更新集合时自动更新,因此我需要使用SnapshotListener。一切正常,但我不确定在Viewcontroller关闭时如何与监听器分离。

在单身人士课程中,我有以下方法。该方法提供了一个用户列表,将从我的应用程序周围的几个不同位置调用。

我还想回放一个对侦听器的引用,以便在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 :(得分:5)

猜测您看到的编译器错误指的是您正在使用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()
}

答案 1 :(得分:-1)

我认为 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)
     }
 } }