ios – Firebase删除观察者

前端之家收集整理的这篇文章主要介绍了ios – Firebase删除观察者前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在代码删除Firebase观察者时遇到问题.这是结构的细分:
  1. var ref = Firebase(url:"https://MY-APP.firebaseio.com/")
  2. var handle = UInt?
  3.  
  4. override func viewDidLoad() {
  5. handle = ref.observeEventType(.ChildChanged,withBlock: {
  6. snapshot in
  7.  
  8. //Do something with the data
  9. }
  10. }
  11.  
  12. override func viewWillDisappear(animated: Bool) {
  13. if handle != nil {
  14. println("Removed the handle")
  15. ref.removeObserverWithHandle(handle!)
  16. }
  17. }

现在,当我离开viewcontroller时,我看到“Removed the handle”被打印出来,但是当我返回viewcontroller时,我的观察者会为每个事件调用两次.当我离开并再次返回时,它被召唤三次.等等.为什么观察者没有被移除?

我也在代码中稍后调用ref.setValue(“some value”),这可能与它有什么关系吗?

解决方法

以为我有这个错误,但实际上我试图删除观察者的错误参考.

原始代码

  1. let ref: FIRDatabaseReference = FIRDatabase.database().reference()
  2. var childAddedHandles: [String:FIRDatabaseHandle] = [:]
  3.  
  4. func observeFeedbackForUser(userId: String) {
  5. if childAddedHandles[userId] == nil { // Check if observer already exists
  6.  
  7. // NOTE: - Error is caused because I add .child(userId) to my reference and
  8. // do not when I call to remove the observer.
  9.  
  10. childAddedHandles[userId] = ref.child(userId).observeEventType(.ChildAdded) {
  11. [weak self] (snapshot: FIRDataSnapshot) in
  12.  
  13. if let post = snapshot.value as? [String:AnyObject],let likes = post["likes"] as? Int where likes > 0 {
  14.  
  15. self?.receivedFeedback(snapshot.key,forUserId: userId)
  16. }
  17. }
  18. }
  19. }
  20.  
  21. func stopObservingUser(userId: String) {
  22. // THIS DOES NOT WORK
  23.  
  24. guard let cah = childAddedHandles.removeValueForKey(userId) else {
  25. print("Not observing user")
  26. return
  27. }
  28.  
  29. // Error! I did not add .child(userId) to my reference
  30. ref.removeObserverWithHandle(cah)
  31. }

固定代码

  1. func stopObservingUser(userId: String) {
  2. // THIS WORKS
  3.  
  4. guard let cah = childAddedHandles.removeValueForKey(userId) else {
  5. print("Not observing user")
  6. return
  7. }
  8.  
  9. // Add .child(userId) here
  10. ref.child(userId).removeObserverWithHandle(cah)
  11. }

猜你在找的iOS相关文章