我将 Firestore 与 Swift 结合使用。
我有一个单例数据类 UserManager。我从不同的 ViewControllers 调用它来获取数据来填充我的 TableView 。我希望 TableView 在集合更新时自动更新,因此我需要使用 SnapshotListener。一切正常,但我不确定在关闭 Viewcontroller 时如何与监听器分离。
在单例类中,我有如下所示的方法。该方法提供了一个用户列表,并将从我的应用程序周围的几个不同位置调用。
我还想返回对监听器的引用,以便在关闭 Viewcontroller 时可以与它分离。但我无法让它工作。下面的解决方案给出了编译器错误。
我一直在尝试查看引用资料,例如这里 https://firebase.google.com/docs/firestore/query-data/listen但是当数据加载到单例类中而不是直接加载到 Viewcontroller 中时,我需要让它工作。去这里的路是什么?
在用户管理器中:
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)
}
}
}
在 View Controller 中:
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()
}
最佳答案
我猜想您看到的编译器错误是指您在其自己的定义上下文中使用listener
。
试试这个来改变:
在用户管理器中:
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)
}
}
}
在 View Controller 中:
override func viewDidLoad() {
super.viewDidLoad()
self.listener = UserManager.shared.allUsers(completion: { (users) in
self.users = users
self.tableView.reloadData()
})
}
deinit {
self.listener.remove()
}
关于ios - 与 Firestore 监听器分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50716670/