2017-02-26 34 views
1

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

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

回答

3

当您附加侦听器/观察者时,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) 

要知道,你赢了尽管如此,最好的结果是数据库客户端只是丢弃从服务器获得的数据。

+0

一如既往,感谢弗兰克(需要有这个地方,我可以复制和粘贴:)) – Edward

+0

嗨@Frank假设你不想使用观察,而不是observeSingleEvent为了能够使用手柄删除它 – Edward

+0

这个问题具体是关于'observeSingleEvent',所以这就是我的回答。在这种情况下,分离侦听器的用处是相当有限的,但它确实涵盖了一些边缘情况。 –

相关问题