【发布时间】:2015-08-19 10:42:59
【问题描述】:
所以,我使用的是官方的 Hacker News API,它托管在 Firebase 上。
我遇到的问题是我想获得列表的一个子集。
一路走来。 let topNewsRef = firebase.childByAppendingPath("topstories").queryLimitedToFirst(UInt(batchSize + offset)).queryLimitedToLast(UInt(batchSize))
[我知道这不起作用,但我想要这种效果]。基本上我想要一个集合的一个子集,由一个范围指定;例如从第 2 项到第 15 项]。
假设我想要第 75 项中的 50 项,但上述方法不起作用。所以问题是;怎样才能达到同样的效果?
例如;给出 Firebase 中 100 个项目的列表。我想要 50 号和 75 号的所有项目。没有属性可以泄露项目的顺序。
这是我目前的解决方案;
let topNewsRef = firebase.childByAppendingPath("topstories").queryLimitedToFirst(UInt(batchSize + offset))
var handle: UInt?
handle = topNewsRef.observeEventType(.Value) { (snapshot: FDataSnapshot!) -> Void in
if let itemIDs = snapshot.value as? [Int] {
itemIDs.dropFirst(offset) // This drops all items id I already fetched ...
for itemID in itemIDs {
let itemRef = self.firebase.childByAppendingPath("item/\(itemID)")
var itemHandle: UInt?
itemHandle = itemRef.observeEventType(.Value, withBlock: { (snapshot: FDataSnapshot!) -> Void in
if let itemHandle = itemHandle {
itemRef.removeObserverWithHandle(itemHandle)
}
if let json = snapshot.value as? [String:AnyObject],
// Handle JSON ...
}
})
}
}
if let handle = handle {
topNewsRef.removeObserverWithHandle(handle)
}
} // offset += batchSize
... 这是从开始(偏移)到结束(batchSize + 偏移)的所有项目,然后我将列表的第一端删除偏移的大小。因此,在列表中留下了 batchSize 的大小。
【问题讨论】:
-
您不会调用任何
queryOrderedBy...,这就是 Firebase 文档中的示例所做的:firebase.com/docs/ios/guide/… 这不是问题,然后“不工作”是非常广泛的。它有什么作用?你期望它做什么?如果您显示观察和处理事件类型的块,我也可能很有用。 -
queryLimitedToFirst() 和 queryLimitedToLast() 不能串联使用。使用其中一种。您正在寻找与 queryOrderedBy*() 一起使用的 startAt() 和 endAt()
-
您需要再次阅读我的问题。你们俩。我无法按任何顺序查询,因为数据已经排序并且不在我的控制之下。没有属性(例如 id)或其他类似的东西。
-
我不确定我是否理解这个问题。无论如何,我在example plnkr 中尝试了一下。我意识到这是在 JavaScript 中,但也许它会有所帮助。这是否与您正在尝试做的事情一致?总而言之,我一次获得两个
/topstories,下载topstory引用的/item的值,并推送/topstories的侦听器。 -
它似乎正在工作。项目的值会在 Firebase 实例中更新时更新。 javascript 中的查询是
var query = ref.orderByKey().startAt(''+$scope.options.offset).endAt(''+($scope.options.offset+$scope.options.batchSize-1));-- 整数被更改为字符串,因为startAt()和endAt()参数在与orderByKey()一起使用时需要是字符串。