2017-02-16 21 views
0

firebase 3を使用してangularjs 1.5でWebアプリケーションを開始しました。今はWebアプリケーションのIOSアプリケーションを作成します。このアプリケーションは、ユーザーが作業時間をチェックインまたはチェックアウトできるクロックシステムです。Firebase 3とSwift 3(オブザーバー停止)でデータを一度取得する方法

これを簡単にするために、私はfirebaseこの表のようにしました:

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

ケース:

  • ユーザーは "OUT" の値を持っている場合は、新しいworktimeを作成します。
  • ユーザーがNULLのように "OUT"に値がない場合は、 を "OUT"に更新し、現在のタイムスタンプを設定します。 JSで

、私のコードは次のようになります。私が書いたように

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 

    }) 

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 
}) 

クエリ(スウィフト3)コメント(更新クエリの後を参照)では、スナップは最後に終了しますが、スナップショットを介して再びループします。データが変更されたためにループが再びトリガされたため、私はそれを認識しました。

私はオブザーバーを削除するには

ref.removeAllObservers() 

で試してみました。うまくいきましたが、更新の後に試してみたら、それはうまくいきませんでした。決して停止しないループを作成します。どのように私は観察を停止することができます、私は新しい更新を確認する必要はありません。

ありがとうございます!

答えて

4

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

感謝の男に概説されているようだけobserveSingleEventを使用!私はすでにobserveSingleEventを試してみましたが、うまくいきませんでした。しかし、あなたのコメントで、私はparamsの "of:"を忘れていたことが分かりました。それは今働きます! –

+0

素晴らしい!それはあなたのために働いてうれしい –

関連する問題