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



我想在按下按钮时在viewController中分离snapshotListener。我在阅读其他的stack over flow问题和文档,他们在同一个函数中调用监听器的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()

相关内容

  • 没有找到相关文章

最新更新