Как я могу получить данные один раз в Firebase 3 и Swift 3 (остановка наблюдателя)

Я запустил свое веб-приложение в angularjs 1.5 с firebase 3. Теперь я хочу создать приложение IOS для своего веб-приложения. Приложение представляет собой систему часов, в которой пользователь может проверять или проверять свое отработанное время.

Для простоты мне нравится эта таблица в firebase:

worktimes
   -Kd4swkAQJTRjCbD0CCy
     + ----- IN  | '2017-02-16 10:00:00'
     + ----- OUT | '2017-02-16 13:00:00'

Случаи:

  • Если у пользователя есть значение «OUT», создайте новое рабочее время.
  • Если у пользователя нет значения в «OUT», например NULL, я хочу обновить «OUT» и установить текущую отметку времени.

В JS мой код выглядит так:

var database = firebase.database();
var ref = database.ref().child('worktimes')

Запрос (Javascript):

ref
   .startAt('2017-02-16 00:00:00')
   .endAt('2017-02-16 23:59:59')
   .orderByChild('timestamp')
   .limitToLast(1)
   .once('value', function(snapshot) { 
       // Getting data once here
})

Запрос (Swift 3):

ref
   .queryStarting(atValue: "2017-02-16 00:00:00")
   .queryEnding(atValue: "2017-02-16 23:59:59")
   .queryOrdered(byChild: "timestamp")
   .queryLimited(toLast: 1) // return only the latest entry
   .observe(FIRDataEventType.value, with: { (snapshot) in

      if !snapshot.value is NSNull {
         // work here with the data once

        for child in snapshot.children {
        // if I do an update here like this:

              let snap = child as! FIRDataSnapshot 
              let dict = snap.value as! [String: AnyObject] 

              let id = dict["id"] as! String
              let IN = dict["in"]
              let OUT = dict["out"]

              if(OUT  == nil){

        // UPDATE QUERY     
        // If I update here my Data, the query ends and starts again.

        ref.child("-Kd4swkAQJTRjCbD0CCy").updateChildValues(["timestamp" : "2017-02-"])

              } else {

           // creating new worktime here.. 
           }

         } // end of for

      } // end of if

   })

Как я писал в комментарии (см. После запроса на обновление), привязка завершается, но она снова проходит через снимок. Я понял, потому что данные изменились, он снова запускает цикл.

Я пробовал с

ref.removeAllObservers()

Убрать наблюдателя. Он работал нормально, но если я попробовал после обновления Query, это не сработало. Это создает непрерывный цикл. Как мне остановить наблюдение, мне не нужно проверять наличие новых обновлений.

Заранее спасибо!


person Haris Bjelic    schedule 16.02.2017    source источник


Ответы (1)


Просто используйте observeSingleEvent, как указано в документации.

ref
   .queryStarting(atValue: "2017-02-16 00:00:00")
   .queryEnding(atValue: "2017-02-16 23:59:59")
   .queryOrdered(byChild: "timestamp")
   .queryLimited(toLast: 1) // return only the latest entry
   .observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in
       ...
person Andrew Brooke    schedule 16.02.2017
comment
Спасибо чувак! Я уже пробовал наблюдать за одиночным событием, ничего не вышло. Но теперь в вашем комментарии я увидел, что пропустил of: в params. Теперь это работает! - person Haris Bjelic; 16.02.2017