微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在本地范围内分离侦听器?

如何解决如何在本地范围内分离侦听器?

我想在按下按钮时分离 viewController 中的 snapshotListener。我正在阅读其他堆栈问题和文档,他们在同一个函数中为侦听器调用 remove 方法。在我的情况下,我尝试这样做,但我的 snapshotListener 根本没有工作。

这是我想要调整的函数代码块。

@objc func doneTapped() {
    
    let updateListener = db.collection("school_users/\(user?.uid)/events").whereField("event_name",isEqualTo: navigationItem.title).addSnapshotListener(includeMetadataChanges: true) { (querySnapshot,error) in
        if let error = error {
            print("There was an error fetching the documents: \(error)")
        } else {
            self.eventName = querySnapshot!.documents.map { document in
                return EventName(eventName: (document.get("event_name") as! String))
            }
            
            self.db.document("school_users/\(self.user?.uid)/events/\(self.docIDUneditableTextF.text!)").updateData(["event_date": self.dateEditableTextF.text,"event_cost": self.costEditableTextF.text,"for_grades": self.gradesEditableTextF.text]) { (error) in
                if let error = error {
                    print("There was an error updating the document: \(error)")
                } else {
                   print("The document was successfully updated."
                }
            }
        }
    }
    
    dateEditableTextF.resignFirstResponder()
    dateEditableTextF.isEnabled = false
    
    costEditableTextF.resignFirstResponder()
    costEditableTextF.isEnabled = false
    
    
    gradesEditableTextF.resignFirstResponder()
    gradesEditableTextF.isEnabled = false
    
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit,target: self,action: #selector(editTapped))

}

我尝试调用 updateListener.remove() 但它使我的 snapshotListener 根本无法工作,而且当文档更新时,打印语句永远不会结束,这也是因为侦听器仍然处于活动状态还是另一个问题?

解决方法

addSnapshotListener 会在数据发生变化时为您提供更新。我不清楚你为什么要立即删除侦听器,如果你真的想接收更新——而且,正如你所指出的,立即删除它基本上会导致它根本不起作用。或许可以发布一些帖子/文档的链接,您可以在其中看到您引用的代码,这样有人可以深入了解正在发生的事情。

我怀疑您实际上并不需要对数据进行更新。在这种情况下,您可以使用 .getDocuments() 代替。有关获取数据的不同方式,请参阅此处的 Firestore 文档:https://firebase.google.com/docs/firestore/query-data/get-data

第二个问题(无限打印)与第一个问题有关。因为您有一个侦听器,它将在数据更改时返回更新,所以当您进行第二次数据库调用(您的 updateData)时,它会更新您的数据,再次触发侦听器。这将继续循环,因为他们将继续互相呼叫。这是另一个迹象,表明您可能实际上并不想要一个侦听器,而是一次获取数据的调用。如果您确实确实想要更新,则必须找到一种方法来解耦您的第二个请求,以免陷入循环。

根据评论更新:(在不同函数中移除监听器的示例)

在您的视图、视图控制器等上,为侦听器声明一个属性:

class MyViewController : UIViewController {
  private var documentListener: ListenerRegistration? //assuming that ListenerRegistration is the correct type here,but you can check the current type of your updateListener to check
}

然后,在您的函数中,将您的侦听器设置为:

documentListener = db.collection("school_users/\(user?.uid)/events").whereField("event_name",isEqualTo: navigationItem.title).addSnapshotListener()...

然后,稍后(如在 viewDidDisappear 中),您可以将其删除:

documentListener?.remove()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。