在我的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)
}
如何在再次执行此方法之前取消此方法?
答案 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)