逐步下载Firebase儿童iOS

时间:2017-01-05 20:03:16

标签: ios swift firebase firebase-realtime-database

所以我有一个类似Tinder的iOS Firebase项目。有一个节点包含所有产品作为子节点。

当用户进入应用程序时,他/她可以向左滑动他们不想要的产品,也可以向他们想要保存的产品。

我的问题是,目前,我的Firebase项目会立即下载所有产品,这显然不适用于100多种带图像的产品。我想实现一个首先下载3个产品的系统。然后,一旦用户向左/右滑动第一个产品,它就会下载另一个产品并将其添加到列表的后面,这样总有三个产品缓冲区。

问题是,如果用户滑动(我的孩子都是.childAdded),我怎样才能让Firebase吐出一个.childByAutoId

请记住,可以删除产品,因此只能保留我们当前所在项目的索引。

谢谢。

2 个答案:

答案 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的答案对您的实施有帮助!