Firebase删除观察员 [英] Firebase removing observers
问题描述
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屋!