发布
社区首页 >问答首页 >对于相同的文档更新,有两个重叠的侦听器吗?

对于相同的文档更新,有两个重叠的侦听器吗?
EN

Stack Overflow用户
提问于 2022-08-11 04:47:13
回答 1查看 54关注 0票数 2

我有两个侦听器,它们都在观察相同的集合“任务”。

  • 一个查询检索不完整的任务(已完成的== false)
  • 其他查询在过去24小时内检索完成的任务(已完成的== true && completionDate >(日期- 24小时))

由于这种逻辑,两个侦听器碰巧相互重叠。如果我更新要完成的任务。两个快照侦听器都将运行。然而,这是同一份文件。

问:,我会因为更新一份文件而被收取两次费用吗?还是侦听器知道同一个文档已经更新了一次,并且只会被计费一次?

代码语言:javascript
代码运行次数:0
复制
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小时内已完成的任务,是为了让用户能够在这段时间内取消检查或进行更改。这样它就不会再被取走了。我不想添加一个监听器来获取所有的任务,因为这样做的代价会很高,我也不想实现分页,因为我失去了实时更新,而为侦听器分页也相当费劲。

EN

回答 1

Stack Overflow用户

发布于 2022-08-12 01:09:18

云修复对您读取、写入和删除的文档数量收取费用,因此,每次更新结果中的文档时,都会收取读取的费用。

由于您有两个运行相同文档的活动侦听器,所以第一个侦听器需要从服务器(文档)获取或检查数据,而第二个侦听器可以从缓存中读取数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73315393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档