【问题标题】:How to cancel a firebase observe single event database call如何取消firebase观察单事件数据库调用
【发布时间】:2017-02-26 13:05:27
【问题描述】:

在我的 iOS 应用中,用户可以通过搜索唯一的用户名来添加朋友。

用户在 textField 中输入用户名,我有一个 textFieldDidChange 通知,每次文本更改时都会触发。

然后我在该方法中调用下面的 Firebase 方法来检查用户名是否存在。

func searchFor(_ username: String) {

    guard let uid = FIRAuth.auth()?.currentUser?.uid else {
        return
    }

    let lowercaseUsername = username.lowercased()
    let ref = FIRDatabase.database().reference()

    ref.child(FirebaseDatabaseBranchNames.usernames.rawValue).child(lowercaseUsername).observeSingleEvent(of: .value, with: { [unowned self](snapshot) in

        if snapshot.exists() {
            if let usernameUid = snapshot.value as? String {
                self.isUserAlreadyAFriend(ref, uid: uid, usernameUid: usernameUid)
            }
        } else {
            // username doesn't exist
        }

    }, withCancel: nil)
}

如何在再次执行之前取消此方法?

【问题讨论】:

    标签: ios firebase firebase-realtime-database


    【解决方案1】:

    当您附加侦听器/观察者时,Firebase 会返回该观察者的句柄。随后您可以通过调用ref.removeObserverWithHandle() 来移除监听器/观察器。

    因此假设您最多需要一个观察者,您可以将引用和观察者句柄保留在您类的成员字段中,然后在 searchFor 方法中使用此代码:

    if (self.searchHandle != nil) {
        self.searchRef.removeObserverWithHandle(searchHandle)
    }
    
    self.searchRef = ref.child(FirebaseDatabaseBranchNames.usernames.rawValue).child(lowercaseUsername)
    self.searchHandle = self.searchRef.observeSingleEvent(of: .value, with: { [unowned self](snapshot) in
        if snapshot.exists() {
            if let usernameUid = snapshot.value as? String {
                self.isUserAlreadyAFriend(ref, uid: uid, usernameUid: usernameUid)
            }
        } else {
            // username doesn't exist
        }
    
    }, withCancel: nil)
    

    请注意,尽管如此,您不会保存数据传输,因为最可能的结果是数据库客户端只是丢弃了从服务器返回的数据。

    【讨论】:

    • 一如既往,谢谢弗兰克(需要有这个我可以复制和粘贴的地方:))
    • 嗨@Frank 假设您的意思是不使用observe 而不是observeSingleEvent,以便能够使用句柄将其删除
    • 这个问题专门针对observeSingleEvent,所以我就是这么回答的。在这种情况下分离侦听器的用处是相当微不足道的,但它确实涵盖了一些边缘情况。
    • 嗨 @FrankvanPuffelen,似乎 observeSingleEvent func 返回 Void。你认为我们应该使用-observeEventType:withBlock吗?
    • 看起来 API 确实改变了 Jonny。在这种情况下,取消单个事件观察者似乎是不可能的,您应该使用常规观察者来获得可取消的行为。请注意,能够取消单个事件观察者是一个有效的用例,因为例如,如果客户端未连接到服务器,则监听器不会触发(除非它的缓存中已经有数据)。跨度>
    【解决方案2】:

    最好在观察单个事件块之后添加“removeAllObservers()”。它对我有用。

    let ref = Database.database().reference().ref.child(XXXX).child(YYYYY)
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        
        }else{
        }
    }) { (error) in
        print(error.localizedDescription)
        }
    ref.removeAllObservers()
    

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      相关资源
      最近更新 更多