所以,我正在使用官方的黑客新闻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 + offset)的所有项目,然后我按列表的大小删除列表的第一个结尾。因此,留下列表的大小为batchSize。
答案 0 :(得分:3)
根据我们对您的问题的评论,
您可以将.queryOrderedByKey
与queryStartingAtValue:
,queryEndingAtValue:
/topstories
中的数据存储为数组。当按键排序时,数组中对象的索引是键。然后,您需要做的就是将offset
和batchSize
作为字符串投射并传递给queryStartingAtValue:
& queryEndingAtValue:
喜欢这样:
ref.queryOrderedByKey().queryStartingAtValue(String(offset)).queryEndingAtValue(String(offset+batchSize-1));
startingAtIndex = initialOffset + (batchSize * (n - 1))
endingAtIndex = initialOffset + (batchSize * n) - 1
batchSize
= 100,初始offset
= 0。
key
(索引)是0
。 endingAt(offset+batchSize)
,您将以索引100结束,这是数组中的第101项。这是在JavaScript中实现的相同概念的example PLNKR。
:)
答案 1 :(得分:1)
好的,所以问题通过以下查询解决了。
firebase.childByAppendingPath("topstories").queryOrderedByKey().queryStartingAtValue(String(offset)).queryEndingAtValue(String(offset + batchSize - 1))
问题是Firebase文档没有指定" AnyObject!"参数可以用作查询的索引。他们也忘了提到索引应该是String类型。