使用Firebase

时间:2015-08-19 10:42:59

标签: ios swift firebase

所以,我正在使用官方的黑客新闻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。

2 个答案:

答案 0 :(得分:3)

根据我们对您的问题的评论,

您可以将.queryOrderedByKeyqueryStartingAtValue:queryEndingAtValue:

结合使用

/topstories中的数据存储为数组。当按键排序时,数组中对象的索引是键。然后,您需要做的就是将offsetbatchSize作为字符串投射并传递给queryStartingAtValue:& queryEndingAtValue:喜欢这样:

ref.queryOrderedByKey().queryStartingAtValue(String(offset)).queryEndingAtValue(String(offs‌​et+batchSize-1));
  • 如果要通过batchsize增加偏移量,请不要忘记为endingValue减去1。
  • 对于系列中的第n个查询,
    • startingAtIndex = initialOffset + (batchSize * (n - 1))
    • endingAtIndex = initialOffset + (batchSize * n) - 1
  • 例如,让batchSize = 100,初始offset = 0。
    • 前100个项是0到99的键。数组中第一个项的key(索引)是0
    • 如果您查询endingAt(offset+batchSize),您将以索引100结束,这是数组中的第101项。
    • 因此,您将获得101件商品 - 比批量大一件。
    • 第二个查询将用于索引为100-199的项目(从0 + batchsize开始,到0 + batchsize + batchsize-1结束),这是100项。

这是在JavaScript中实现的相同概念的example PLNKR

:)

答案 1 :(得分:1)

好的,所以问题通过以下查询解决了。

firebase.childByAppendingPath("topstories").queryOrderedByKey().queryStartingAtValue(String(offset)).queryEndingAtValue(String(offset + batchSize - 1))

问题是Firebase文档没有指定" AnyObject!"参数可以用作查询的索引。他们也忘了提到索引应该是String类型。