所以我有一个类似Tinder的iOS Firebase项目。有一个节点包含所有产品作为子节点。
当用户进入应用程序时,他/她可以向左滑动他们不想要的产品,也可以向他们想要保存的产品。
我的问题是,目前,我的Firebase项目会立即下载所有产品,这显然不适用于100多种带图像的产品。我想实现一个首先下载3个产品的系统。然后,一旦用户向左/右滑动第一个产品,它就会下载另一个产品并将其添加到列表的后面,这样总有三个产品缓冲区。
问题是,如果用户滑动(我的孩子都是.childAdded
),我怎样才能让Firebase吐出一个.childByAutoId
?
请记住,可以删除产品,因此只能保留我们当前所在项目的索引。
谢谢。
答案 0 :(得分:0)
首先想到的是,您只需跟踪当前缓冲区中有多少项目。如果它低于最低值,您将下载更多,Firebase会在后台执行所有下载操作,因此无需担心。您还可以使用计数器上的闭包来自动下载。
要从子节点列表中下载特定数量,请查看firebase查询。它们用于对返回给您的节点进行排序,以及用于获取特定索引处的节点。
但是,这并不能解决您在任何特定时刻可能删除节点的问题。为此,您可以尝试计算当前正在查看的项目的哈希值,并将其与当前会话中已查看的项目的哈希表进行比较。如果找到匹配,那么该项目已经被查看,并且数据库中存在一些索引的混乱。 (即项目已被删除)
只是一个想法。
答案 1 :(得分:0)
您需要为每个项目存储某种标记(如果您希望根据孩子的创建时间逐步下载项目,则可能是时间戳)。
然后只需使用如下查询:
var startingValue: String = ""
if itemsArray.count == 0 {
startingValue = Date() // start at the current date and work your way backwards
}
else {
startingValue = itemsArray.last.timestamp // last item we stopped at in the retrieval process
}
itemsRef.queryOrderedByChild("timestamp").queryStartingAtValue(startingValue).queryLimitedToFirst(numberOfItemsToBeRetrievedPerQuery).observeEventType(FIRDataEventType.value, withBlock: { (snapshot) in
// append the retrieved items to your array
})
请注意,要使其正常工作(首先获取最新项目,我假设您正在尝试执行此操作),您需要使用负数标志(所以它会被颠倒)。所以你的结构看起来像这样:
"items" : {
"item1Key" : {
"itemName": "Item 1"
"moreItemData": "random data"
"timestamp": -1.57983164250361E12
},
"item2Key" : {
"itemName": "Item 2"
"moreItemData": "random data"
"timestamp" : -1.42182335765741E12
},
...
}
您可能会发现此question的答案对您的实施有帮助!