繁体   English   中英

如何在Firebase 3和Swift 3(停止观察器)中一次检索数据

[英]How can I retrieve the data once in Firebase 3 and Swift 3 (Stopping observer)

我使用firebase 3在angularjs 1.5中启动了我的Web应用程序。现在我想为我的Web应用程序创建IOS应用程序。 该应用程序是一个时钟系统,用户可以在其中检入或检出他的工作时间。

为了简单起见,我喜欢firebase中的此表:

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

查询(快速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作为中概述文件

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM