我在带有firebase 3的angularjs 1.5中启动了我的web应用程序。我现在想为我的Web App创建一个IOS应用程序。该应用程序是一个时钟系统,用户可以在其中签入或签出他的工作时间。
为了简单起见,我喜欢firebase中的这个表:
worktimes
-Kd4swkAQJTRjCbD0CCy
+ ----- IN | '2017-02-16 10:00:00'
+ ----- OUT | '2017-02-16 13:00:00'
案例:
在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()
删除观察者。它工作正常,但如果我尝试更新后查询它不起作用。它创造了一个永不停止的循环。如何停止观察,我不需要检查新的更新。
提前致谢!
答案 0 :(得分:4)
只需使用documentation
中列出的observeSingleEvent
即可
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
...