Firebase删除观察员 [英] Firebase removing observers

查看:95
本文介绍了Firebase删除观察员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的代码中移除Firebase观察者时遇到问题。以下是结构细分:

  var ref = Firebase(url:https://MY-APP.firebaseio.com /)
var handle = UInt?

覆盖func viewDidLoad(){
handle = ref.observeEventType(.ChildChanged,withBlock:{


//快照数据



重写func viewWillDisappear(animated:Bool){
if handle!= nil {
println(Remove the handle)
ref.removeObserverWithHandle(handle!)
}
}

现在当我离开viewcontroller的时候,我看到Remove the handle被打印出来,但是当我返回到viewcontroller的时候,我的观察者每次被调用两次,当我离开并且再次返回的时候,它被调用了三次。是不是被删除的观察者?

我也在后面调用 ref.setValue(some value)代码,这可能与它有什么关系吗?
解决方案

原以为我有这个错误,但实际上我试图删除观察者的错误引用。

ORIGINAL CODE:
$ b

  let ref:FIRDatabaseReference = FIRDatabase.database()。reference()
VAR childAddedHandles:[字符串:FIRDatabaseHandle] = [:]

FUNC observeFeedbackForUser(用户ID:字符串){
如果childAddedHandles [用户id] ==零{//检查是否观察者已存在

//注意: - 错误是由于我将.child(userId)添加到我的引用而引起的,而
//在调用移除观察者时不引起。

childAddedHandles [用户id] = ref.child(用户id).observeEventType(.ChildAdded){
[自弱(快照:FIRDataSnapshot)在

要是让post = snapshot.value as? [String:AnyObject],
let likes = post [likes] as? Int在哪里,喜欢> 0 {

self?.receivedFeedback(snapshot.key,forUserId:userId)
}
}
}
}

FUNC stopObservingUser(用户名:字符串){
//这不起作用

后卫让CAH = childAddedHandles.removeValueForKey(用户ID)否则{
打印( 未观察用户 )
返回
}

//错误!我没有将.child(userId)添加到我的引用
ref.removeObserverWithHandle(cah)
}

FIXED CODE:

pre $ func stopObservingUser(userId:String){
//这个工作

警卫let cah = childAddedHandles.removeValueForKey(userId)else {
print(Not observing user)
return
}

/ / add .child(userId)here
ref.child(userId).removeObserverWithHandle(cah)
}


I have a problem removing a Firebase observer in my code. Here's a breakdown of the structure:

var ref = Firebase(url:"https://MY-APP.firebaseio.com/")
var handle = UInt?

override func viewDidLoad() {
    handle = ref.observeEventType(.ChildChanged, withBlock: {
        snapshot in

        //Do something with the data
    }
}

override func viewWillDisappear(animated: Bool) {
    if handle != nil {
        println("Removed the handle")
        ref.removeObserverWithHandle(handle!)
    }
}

Now when I leave the viewcontroller, I see that "Removed the handle" is printed, but when I return to the viewcontroller, my observer is called twice for each event. When I leave and return again, it's called three times. Etc. Why is the observer not being removed?

I do also call ref.setValue("some value") later in the code, could this have anything to do with it?

解决方案

Thought I was having this bug but in reality I was trying to remove observers on the wrong reference.

ORIGINAL CODE:

let ref: FIRDatabaseReference = FIRDatabase.database().reference()
var childAddedHandles: [String:FIRDatabaseHandle] = [:]

func observeFeedbackForUser(userId: String) {
    if childAddedHandles[userId] == nil { // Check if observer already exists

        // NOTE: - Error is caused because I add .child(userId) to my reference and
        //     do not when I call to remove the observer.

        childAddedHandles[userId] = ref.child(userId).observeEventType(.ChildAdded) { 
            [weak self] (snapshot: FIRDataSnapshot) in

            if let post = snapshot.value as? [String:AnyObject],
               let likes = post["likes"] as? Int where likes > 0 {             

                self?.receivedFeedback(snapshot.key, forUserId: userId)          
            }
        }
    }
}

func stopObservingUser(userId: String) {
    // THIS DOES NOT WORK

    guard let cah = childAddedHandles.removeValueForKey(userId) else {
        print("Not observing user")
        return
    }

    // Error! I did not add .child(userId) to my reference
    ref.removeObserverWithHandle(cah)
}

FIXED CODE:

func stopObservingUser(userId: String) {
    // THIS WORKS

    guard let cah = childAddedHandles.removeValueForKey(userId) else {
        print("Not observing user")
        return
    }

    // Add .child(userId) here
    ref.child(userId).removeObserverWithHandle(cah)
}

这篇关于Firebase删除观察员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆