2017-02-16 87 views
0

我使用firebase 3啓動了我的Web應用程序,並在angularjs 1.5中啓動。我現在要爲我的Web App創建一個IOS應用程序。該應用程序是一個時鐘系統,用戶可以檢查或檢查他的工作時間。如何在Firebase 3和Swift 3(停止觀察者)中檢索一次數據

爲了使這個簡單,我有這樣的表中火力點:

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

試圖刪除觀察者。它工作正常,但如果我嘗試更新後查詢它不起作用。它創建一個永不停止的循環。我怎樣才能停止觀察,我不需要檢查新的更新。

提前致謝!

回答

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

感謝夥計!我已經嘗試過觀察SingleEvent,它沒有工作。但是我現在在你的評論中看到,我錯過了參數中的「:」。它現在有效! –

+0

太棒了!很高興爲你工作 –