2017-02-16 10 views
0

firebase 3을 사용하여 angularjs 1.5에서 웹 응용 프로그램을 시작했습니다. 이제 웹 응용 프로그램 용 IOS 응용 프로그램을 만들고 싶습니다. 응용 프로그램은 사용자가 근무 시간을 체크인 또는 체크 아웃 할 수있는 시계 시스템입니다.Firebase 3 및 Swift 3 (옵저버 정지 중)에서 데이터를 한 번만 검색하는 방법

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

케이스 : 사용자가 "OUT"값을 가지고

  • 경우 새 근무 시간을 만들을

    나는 중포 기지에서이 테이블처럼했습니다,이 간단하게합니다.
  • 사용자가 NULL과 같이 "OUT"에 값이 없으면 을 "OUT"으로 업데이트하고 현재 타임 스탬프를 설정하려고합니다. JS에서

, 내 코드는 다음과 같습니다

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

쿼리 (자바 스크립트) :

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

그냥 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

좋아요! 너에게 효과가있는 것은 다행이다. –

관련 문제