我有两个侦听器,它们都在观察相同的集合“任务”。
由于这种逻辑,两个侦听器碰巧相互重叠。如果我更新要完成的任务。两个快照侦听器都将运行。然而,这是同一份文件。
问:,我会因为更新一份文件而被收取两次费用吗?还是侦听器知道同一个文档已经更新了一次,并且只会被计费一次?
class TaskData: ObservableObject {
@Published var tasks: [Task] = []
@Published var incompleteTasks: [Task] = []
@Published var completedTasks: [Task] = []
private var db = Firestore.firestore()
private var incompleteTaskslistenerRegistration: ListenerRegistration?
private var completedTasksListenerRegistration: ListenerRegistration?
init() {
subscribe()
Publishers
.CombineLatest($completedTasks, $incompleteTasks)
.dropFirst()
.map { $0 + $1 }
.assign(to: &$tasks)
}
deinit {
unsubscribe()
}
func subscribe() {
guard let userId = Auth.auth().currentUser?.uid else { return }
if incompleteTaskslistenerRegistration != nil || completedTasksListenerRegistration != nil {
unsubscribe()
}
let completedTasksQuery = db.collection("tasks")
.whereField("userId", isEqualTo: userId)
.whereField("completed", isEqualTo: true)
.whereField("completedDate", isGreaterThan: Date().advanced(by: -86400))
completedTasksListenerRegistration = completedTasksQuery.addSnapshotListener { querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("No documents in 'tasks' collection")
return
}
self.completedTasks = documents.compactMap { queryDocumentSnapshot in
try? queryDocumentSnapshot.data(as: Task.self)
}
}
let incompleteTasksQuery = db.collection("tasks")
.whereField("userId", isEqualTo: userId)
.whereField("completed", isEqualTo: false)
incompleteTaskslistenerRegistration = incompleteTasksQuery.addSnapshotListener { querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("No documents in 'tasks' collection")
return
}
self.incompleteTasks = documents.compactMap { queryDocumentSnapshot in
try? queryDocumentSnapshot.data(as: Task.self)
}
}
}
func unsubscribe() {
if incompleteTaskslistenerRegistration != nil {
incompleteTaskslistenerRegistration?.remove()
incompleteTaskslistenerRegistration = nil
}
if completedTasksListenerRegistration != nil {
completedTasksListenerRegistration?.remove()
completedTasksListenerRegistration = nil
}
}
}
编辑1
我只想澄清一下,我之所以查询过去24小时内已完成的任务,是为了让用户能够在这段时间内取消检查或进行更改。这样它就不会再被取走了。我不想添加一个监听器来获取所有的任务,因为这样做的代价会很高,我也不想实现分页,因为我失去了实时更新,而为侦听器分页也相当费劲。
发布于 2022-08-12 01:09:18
云修复对您读取、写入和删除的文档数量收取费用,因此,每次更新结果中的文档时,都会收取读取的费用。
由于您有两个运行相同文档的活动侦听器,所以第一个侦听器需要从服务器(文档)获取或检查数据,而第二个侦听器可以从缓存中读取数据。
https://stackoverflow.com/questions/73315393
复制相似问题