如何取消firebase观察单事件数据库调用

时间:2017-02-26 13:05:27

标签: ios firebase firebase-realtime-database

在我的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)
}

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

2 个答案:

答案 0 :(得分:4)

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

因此,假设您最多只需要一个观察者,您可以将引用和观察者句柄保留在该类的成员字段中,然后在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) 方法中使用此代码:

<label for="name">Name</label>
<label for="email">Email</label>
<label for="phone">Phone</label>
<label for="message">Message</label>

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

答案 1 :(得分:0)

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

server.on('request', (req, res) => app)