我对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()
}
答案 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有一些很棒的文档和示例。查看有关数据库/检索数据的部分,了解有关排序/过滤的更多信息。
希望这有助于您入门,如果您有任何问题,请与我们联系。