如何删除 SnapShot 侦听器(Firestore - Swift)

Posted

技术标签:

【中文标题】如何删除 SnapShot 侦听器(Firestore - Swift)【英文标题】:How to remove SnapShot listener (Firestore - Swift) 【发布时间】:2020-01-04 12:27:35 【问题描述】:
func addUserObserver(_ update: @escaping () -> Void) 
    FriendSystem.system.USER_REF.addSnapshotListener  snapshot, error in
        self.userList.removeAll()

        guard error == nil else 
            print("Error retreiving collection")
            return
        
        for document in snapshot!.documents 
            let email =  document.get("email") as! String
            if email != Auth.auth().currentUser?.email! 
                self.userList.append(User(userEmail: email, userID: document.documentID))
            
            update()
        
    

我添加了一个监听器,但不知道如何断开/删除它。谢谢!

【问题讨论】:

您需要像let listener = FriendSystem.system... 一样添加一个变量来跟踪侦听器,然后再删除它,使用listener.remove()。 Firestore 文档 Detach a listener 对此进行了介绍 【参考方案1】:

如detaching a listener上的文档所示,您需要保留从addSnapshotListener返回的值:

var listener = FriendSystem.system.USER_REF.addSnapshotListener  snapshot, error in
    ...

然后你可以删除监听器:

listener.remove()

【讨论】:

很好的答案,你打败了我。 感谢@Frank Vank Puffelen,但是当我这样做func removeUserListner() listener.remove() 时,我收到错误Use of unresolved identifier 'listener' 这意味着您已将listener 定义为removeUserListner 无法访问的范围。例如,如果 removeUserListner 是同一类中的一个方法,您将希望 listener 成为同一类的一个字段。

以上是关于如何删除 SnapShot 侦听器(Firestore - Swift)的主要内容,如果未能解决你的问题,请参考以下文章

如何删除客户端事件侦听器?

如何在点击侦听器的标记中删除标记?

如何删除 DocumentSnapshot 事件的侦听器(Google Cloud FireStore)

flash AS3 如何删除舞台事件侦听器

如何使用 .bind(this) 删除对象的事件侦听器? [复制]

如何删除某些元素的所有事件侦听器而不使用其子元素