Firebase查询只返回新帖子?

时间:2016-06-26 10:08:54

标签: ios swift firebase firebase-realtime-database

我对firebase相当新,所以我缺乏代码并不是没有尝试更多的公正"我真的不知道从哪里开始#34;。

我试图只显示10分钟以上的帖子"或更少。我要在我的应用中运行一个计时器,以便每秒发送一次查询(假设这不会引起太多问题?),以检查当前的帖子是否超过了10分钟标记,如果是,则查询不应该返回它们。

我已经设置了用户发帖时创建时间戳的位置。

设置为:

Posts 
   02983094jfksdflkaj3l
      timestamp: 23478923019

我假设我需要orderByValue?按时间戳对帖子进行排序,然后以某种限制返回,但我不确定如何将所有内容映射出来。

这里非常感谢正确方向的一点。

提前致谢!

编辑:我不再收集任何帖子出现在集合视图中......无论我有多少帖子应该满足10分钟以下的查询,只有一个会回来。

就像我在下面显示的那样,我没有在快照上获得.value返回...这应该返回我在时间戳快照打印中显示的时间戳值,不是吗?

 override func viewWillAppear(animated: Bool) {
    let cutoff = UInt64(1000 * floor(NSDate().timeIntervalSince1970) - 10*60*1000);
    let cutoffFloat = Float(cutoff) // <-- woudnlt take a UInt64 as an AnyObject. I assume its ok to just do this?


    DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").queryStartingAtValue(cutoffFloat).observeSingleEventOfType(.ChildAdded) { (snapshot: FIRDataSnapshot) in
        print("child added") // <------- isn't ever getting called
        self.Posts = []
      if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {

            for snap in snapshots {

             print("timestamp snap: \(snap)") // <---- returns timestamp snap: Snap (timestamp) 23904819242

                      if let postDict = snap.value as? Dictionary<String, AnyObject> {

                    print(snap.value)// <----- Returns nothing
                    let key = snap.key
                    let post = Post(postKey: key, dictionary: postDict)
                    self.Posts.append(post)

                }
            }
        }

        self.collectionView.reloadData()

}

我不知道它是否有任何帮助,但这是我之前用来填充集合视图的代码:

   DataService.ds.REF_POSTS.observeEventType(.Value) { (snapshot: FIRDataSnapshot) in

        self.Posts = []
        if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {

            for snap in snapshots {

                print(snap)

                if let postDict = snap.value as? Dictionary<String, AnyObject> {
                    let key = snap.key
                    let post = Post(postKey: key, dictionary: postDict)
                    self.Posts.append(post)
                }
            }
        }

       print("got here")
       self.collectionView.reloadData()


    }

2 个答案:

答案 0 :(得分:3)

运行计时器并每10秒发送一次不同的查询是对实时数据库的可怕使用。而是在10分钟前询问所有帖子后运行查询并保持该查询处于活动状态。

借用@Justinin的代码:

let ref = FIRDatabase.database().reference
let cutoff = UInt64(1000 * floor(NSDate().timeIntervalSince1970) - 10*60*1000);    
ref.child("post")
   .queryOrderedByChild("timestamp")
   .queryStartingAtValue(cutoff)
   .observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
       let post = Post(title: snapshot["title"], timestamp: snapshot["timestamp"])
       self.postsArray.append(post)
   }

   self.tableView.reloadData()

    // start a timer that removes expired items from postsArray
    NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "removeExpiredItems", userInfo: nil, repeats: true)
})

然后,客户端运行您的计时器并在帖子“过期”时丢弃这些帖子。

func removeExpiredItems() {
    let cutoff = UInt64(1000 * floor(NSDate().timeIntervalSince1970) - 10*60*1000)
    while (self.postsArray.count > 0 && self.postsArray[0].timestamp < cutoff) {
        // remove first item, because it expired
        self.postsArray.removeAtIndex(0)
    }
    self.tableView.reloadData()
}

答案 1 :(得分:2)

以下是设置运行计时器的方法:

NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector "updateTime", userInfo: nil, repeats: true)

}
func updateTime() {
     let currentTime = NSDate()
    self.time = currentTime.description

}

然后查询firebase过去十分钟的帖子:

let ref = FIRDatabase.database().reference
//let x = currentTime - 10 minutes in equivalent time structure. For example, if by minutes, currentTime - 10. You put that in queryStartingAtValue.
ref.child("post").queryOrderedByChild("timestamp").queryStartingAtValue("x").observeSingleEventOfType(.Value, withBlock: { snapshot in
        self.postsArray.removeAll
        for snap in snapshot.children {
            let post = Post(title: snap["title"], timeStamp: snap["timestamp"])
            self.postsArray.append(post)
        }

      self.tableView.reloadData()
    })

queryStartingAtValue将为您提供具有您指定或更高值的所有帖子。

有一些更好的方法可以解决这个问题,但这应该是一个好的开始,New Firebase有一些很棒的文档和示例。查看有关数据库/检索数据的部分,了解有关排序/过滤的更多信息。

希望这有助于您入门,如果您有任何问题,请与我们联系。