我和Swift一起使用Firestore。
我有一个单例数据类UserManager。我从不同的ViewControllers调用它来获取数据以填充我的表视图。我希望表视图在集合更新时自动更新,因此我需要使用SnapshotListener。一切正常,但我不确定当Viewcontroller关闭时如何从侦听器分离。
在单例类中,我有如下方法。该方法给出了一个用户列表,并将从我的应用程序周围的几个不同位置进行调用。
我还想返回一个对listener的引用,以便在Viewcontroller关闭时可以与之分离。但我不能让它工作。下面的解决方案给出了编译器错误。
我一直在尝试查看引用,例如这里的https://firebase.google.com/docs/firestore/query-data/listen,但当数据加载到单个类中而不是直接加载到视图控制器中时,我需要让它工作。去这里的路怎么走?
在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()
}
发布于 2018-06-06 17:52:09
我认为你要找的是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)
}
} }
https://stackoverflow.com/questions/50716670
复制相似问题