Подтвердить что ты не робот

Удаление наблюдателя после изменения значения в Firebase

У меня есть глобальный наблюдатель в ViewController и нужны некоторые разные наблюдатели внутри него для определенных значений, подобных приведенным ниже. Можно ли удалить наблюдателя после изменения значения один раз?

var ref = Firebase(url: "https://<FIREBASE-APP>.firebaseio.com/")

let handle = ref.observeEventType(.Value, withBlock: { snapshot in

    //Here VALUE Changes to NEW_VALUE
    if snapshot.value as! String == NEW_VALUE {

        //IS IT POSSIBLE TO REMOVE HANDLE HERE????
        ...something here
    }

})

//NOT HERE
...ref.removeObserverWithHandle(handle)
4b9b3361

Ответ 1

Это один из случаев, когда вам нужно сделать дополнительный шаг в Swift, поскольку он не понимает, что вы можете безопасно получить доступ к handle внутри блока.

Один из способов работы с этим:

let ref = Firebase(url: "https://yours.firebaseio.com/")
var handle: UInt = 0
handle = ref.observeEventType(.Value, withBlock: { snapshot in
    print(snapshot)
    if snapshot.exists() && snapshot.value as! String == "42" {
        print("The value is now 42")
        ref.removeObserverWithHandle(handle)
    }
})

Явным образом инициализируя переменную handle, мы удаляем ошибку из компилятора Swift. Но, учитывая, что дескриптор будет установлен до вызова нашего блока, мы можем безопасно вызвать ref.removeObserverWithHandle(handle) внутри блока.