逐步下载Firebase儿童iOS

逐步下载Firebase儿童iOS,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,所以我有一个iOS Firebase项目,工作起来有点像Tinder。有一个节点包含所有产品作为子项 当用户进入应用程序时,他/她可以向左滑动他们不想要的产品,向右滑动他们想要保存的产品 我的问题是,目前,我的Firebase项目一次下载所有产品,这显然不适用于100多个带有图像的产品。我想实现一个系统,首先下载3个产品。然后,一旦用户左/右滑动第一个产品,它将下载另一个产品,并将其添加到列表的后面,以便始终有一个三产品缓冲区 问题是,只有当用户刷卡时(我的孩子都是.childByAutoId)

所以我有一个iOS Firebase项目,工作起来有点像Tinder。有一个节点包含所有产品作为子项

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

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

问题是,只有当用户刷卡时(我的孩子都是
.childByAutoId
),我如何才能让Firebase吐出一个
.childbyadded

请记住,产品是可以删除的,所以简单地保留我们当前所处项目的索引是不可能的


谢谢。

首先想到的是,您只需记录缓冲区中当前有多少项。如果低于最小值,您将下载更多,Firebase在后台执行所有下载操作,因此无需担心。您还可以在计数器上使用闭包来自动下载

要从子节点列表中下载特定数量的节点,请查看firebase查询。它们用于对返回给您的节点进行排序,以及获取特定索引处的节点

但是,这并不能解决节点在任何给定时刻都可能被删除的问题。为此,您可以尝试计算当前正在查看的项目的哈希值,并将其与当前会话中已查看的项目哈希表进行比较。如果找到了匹配项,那么该项已经被查看过,并且数据库中的索引出现了一些混乱。(即,某个项目已被删除)


只是想一想。

您需要为每个项目存储某种标记(如果您希望根据孩子的创建时间逐步下载项目,可能需要一个时间戳)

然后简单地使用如下查询:

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
     },
     ...
}
请注意,为了使这项工作正常(首先获取最新的项目,我假设这是您正在尝试做的),您需要使用负号存储UNIX时间戳(因此它将被反转)。因此,您的结构将如下所示:

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
     },
     ...
}

您可能会发现这个答案对您的实现很有帮助

你所做的几乎是分页;当用户在数据中移动时,会加载更多的数据。无论是一次1个,还是一次3个,还是10个来填充tableView,过程大致相同。在Firebase分页上进行搜索-有很多答案和替代方法。