2017-02-16 5 views
0

Я начал свое веб-приложение в angularjs 1.5 с помощью firebase 3. Теперь я хочу создать приложение IOS для своего веб-приложения. Приложение представляет собой систему часов, в которой пользователь может проверить или проверить время работы.Как я могу получить данные один раз в Firebase 3 и Swift 3 (Stopping observer)

Чтобы сделать это просто, у меня, как эту таблицу в 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, это не сработало. Он создает цикл без остановки. Как я могу остановить наблюдение, мне не нужно проверять наличие новых обновлений.

Заранее благодарен!

ответ

4

Просто используйте observeSingleEvent, как описано в documentation

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 
     ... 
+0

Спасибо чувак! Я уже пробовал наблюдать за сайтом, это не сработало. Но теперь я заметил в вашем комментарии, что я пропустил «из» в параметрах. Он работает сейчас! –

+0

Отлично! Рад, что сработало для вас –

 Смежные вопросы

  • Нет связанных вопросов^_^