我在删除代码中的Firebase观察者时遇到问题。以下是该结构的详细信息:
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!)
    }
}现在,当我离开视图控制器时,我看到打印了“删除句柄”,但是当我返回到视图控制器时,我的观察器被调用了两次。当我离开并再次返回时,它会被调用三次。等。为什么观察者没有被移除?
我在后面的代码中也调用了ref.setValue("some value"),这与它有什么关系吗?
发布于 2016-06-25 07:19:55
我认为我有这个bug,但实际上我试图删除错误引用上的观察者。
原始代码:
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)
}修复代码:
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)
}https://stackoverflow.com/questions/27124118
复制相似问题