Как я могу получить результаты как для существующих, так и для новых дочерних элементов в Firebase?

Я пытаюсь создать запрос в Firebase для своего быстрого приложения iOS. Проблема, с которой я столкнулся с запросом, заключается в том, что он не получает координаты сразу из firebase, если они не изменены. Я пробовал любой другой тип наблюдателя, но ни один из них не работает. Я знаю, что в настоящее время мне нужно изменить тип наблюдателя, но мне нужен правильный способ, чтобы он получал местоположение, как только приложение загружалось, а также обновлялось с помощью firebase. .childAdded сразу получает местоположение, но не обновляется при изменении в Firebase.

userDirectory.queryOrderedByChild("receiveJobRequest")
             .queryEqualToValue(1)
             .observeEventType(.ChildChanged  , withBlock: {snapshot in
        var cIhelperslatitude = snapshot.value["currentLatitude"]
        var cIhelperslongitude = snapshot.value["currentLongitude"]

person ThisISswift    schedule 18.04.2016    source источник


Ответы (1)


Если вы хотите прослушивать несколько типов событий, вам необходимо зарегистрировать несколько прослушивателей.

let query = userDirectory.queryOrderedByChild("receiveJobRequest")
                         .queryEqualToValue(1)

query.observeEventType(.ChildAdded, withBlock: {snapshot in
    var cIhelperslatitude = snapshot.value["currentLatitude"]
    var cIhelperslongitude = snapshot.value["currentLongitude"]

query.observeEventType(.ChildChanged, withBlock: {snapshot in
    var cIhelperslatitude = snapshot.value["currentLatitude"]
    var cIhelperslongitude = snapshot.value["currentLongitude"]

Вы, вероятно, захотите преобразовать этот общий код в метод, который вы будете вызывать из блоков .ChildAdded и .ChildChanged.

В качестве альтернативы вы можете зарегистрироваться на событие .Value, которое запускается для начального значения и каждый раз, когда значение в запросе изменяется. Но так как .Value вызывается со всеми соответствующими дочерними элементами, вам придется перебирать дочерние элементы в вашем блоке:

query.observeEventType(.Value, withBlock: {allsnapshot in
    for snapshot in allsnapshot.children {
        var cIhelperslatitude = snapshot.value["currentLatitude"]
        var cIhelperslongitude = snapshot.value["currentLongitude"]
    }
person Frank van Puffelen    schedule 18.04.2016
comment
Это должно быть query.observeEventType(.Value во второй части ответа? - person Jay; 19.04.2016
comment
Хороший улов. Исправлено! - person Frank van Puffelen; 19.04.2016