如何取消firebase观察单个事件数据库调用
问题描述:
在我的iOS应用中,用户可以通过搜索唯一的用户名来添加好友。如何取消firebase观察单个事件数据库调用
用户在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)
}
如何在再次执行此操作前取消此方法?
答
当您附加侦听器/观察者时,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)
要知道,你赢了尽管如此,最好的结果是数据库客户端只是丢弃从服务器获得的数据。
一如既往,感谢弗兰克(需要有这个地方,我可以复制和粘贴:)) – Edward
嗨@Frank假设你不想使用观察,而不是observeSingleEvent为了能够使用手柄删除它 – Edward
这个问题具体是关于'observeSingleEvent',所以这就是我的回答。在这种情况下,分离侦听器的用处是相当有限的,但它确实涵盖了一些边缘情况。 –