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()
으로 시도했습니다. 괜찮 았어.하지만 업데이트를 시도한 후에 쿼리가 작동하지 않는다. 결코 멈추지 않는 루프를 만듭니다. 어떻게 관찰을 멈출 수 있습니까? 새 업데이트를 확인할 필요가 없습니다.
미리 감사드립니다.
감사합니다 친구에 설명 된대로
observeSingleEvent
를 사용! 이미 observeSingleEvent를 시도했지만 작동하지 않았습니다. 그러나 나는 params에서 "of :"를 놓쳤다는 귀하의 의견을 보았습니다. 이제 작동합니다! –좋아요! 너에게 효과가있는 것은 다행이다. –