我正在将Firebase用作后端服务,并且正在viewDidLoad
上使用以下功能来获取数据,并且一切正常。在获取所有数据后的某个时刻,我想删除该侦听器(仅在首次加载时运行并获取数据)。我该如何实现?以下是我在viewDidLoad
上调用的函数:
private func loadShops(_ category: String) {
db.collection(category).addSnapshotListener { snapshot, error in
guard error == nil else {
print(error!.localizedDescription)
return
}
if let docs = snapshot?.documents {
for doc in docs {
self.shops = []
let shopData = doc.data()
var newShop = Shop()
newShop.shopName = shopData["name"] as? String ?? "Empty Name"
newShop.discountPercentage = shopData["discount"] as? String ?? "0"
newShop.shopArea = shopData["area"] as? String ?? "Empty Area"
newShop.shopCity = shopData["city"] as? String ?? "Empty City"
newShop.phoneNumber = shopData["phone number"] as? String ?? "Empty Phone Number"
newShop.services = shopData["services"] as? String ?? "Empty Services"
self.shops.append(newShop)
self.shops.shuffle()
}
self.shopsView.tableView.reloadData()
}
}
}
基于上面的API示例-我假设您使用的是Firestore API,而不是较旧的Firebase。
如果是Firestore,则可以仅使用查询访存而不是快照侦听器。请参阅https://firebase.google.com/docs/firestore/query-data/queries#execute_a_query
private func loadShops(_ category: String) {
db.collection(category).getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else if let querySnapshot = querySnapshot {
for document in querySnapshot.documents {
print("\(document.documentID) => \(document.data())")
// do the conversion to model object.
}
}
}
仅当您要继续监视云中的新文档时,才使用快照侦听器。根据定价文档,它也很昂贵。