2017-01-05 2 views
0

Итак, у меня есть проект iOS Firebase, который работает вроде как Tinder. Существует узел, содержащий все продукты в качестве детей.Постепенно загрузка Firebase children iOS

Когда пользователь входит в приложение, он может пронести по левому краю продукты, которые они не хотят, и право на те, которые они хотят сохранить.

Моя проблема заключается в том, что в настоящее время мой проект Firebase загружает все продукты сразу, что явно нецелесообразно для более 100 продуктов с изображениями. Я хочу внедрить систему, которая сначала загружает 3 продукта. Затем, как только пользователь переместится влево/вправо для первого продукта, он загрузит другой и добавит его в конец списка, чтобы всегда существовал три буфера продукта.

Вопрос в том, как я могу получить Firebase, чтобы выплюнуть один .childAdded только тогда, когда пользователь проведет (мои дети - все .childByAutoId)?

Имейте в виду, что продукты могут быть удалены, поэтому просто хранить индекс того, что мы сейчас находимся, невозможно.

спасибо.

+0

То, что вы делаете, в значительной степени разбивается на страницы; когда пользователь перемещается по данным, загружается больше данных. Независимо от того, будет ли это 1 за раз или 3 за один раз или 10 для заполнения таблицыView, процесс примерно такой же. Сделайте поиск в Pagination Firebase - есть много ответов и альтернативных подходов. – Jay

ответ

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 
}) 

Обратите внимание, что для того, чтобы это работало (получая самые последние предметы первой, который я предполагаю, что это то, что вы пытаетесь сделать), вам необходимо сохранить отметки времени UNIX с помощью знака (так что оно будет отменено). Так что ваша структура будет выглядеть примерно так:

"items" : { 
    "item1Key" : { 
     "itemName": "Item 1" 
     "moreItemData": "random data" 
     "timestamp": -1.57983164250361E12 
    }, 
    "item2Key" : { 
     "itemName": "Item 2" 
     "moreItemData": "random data" 
     "timestamp" : -1.42182335765741E12 
    }, 
    ... 
} 

Вы можете найти это question «s ответ полезным с реализацией!

0

Первое, что приходит в голову, - это просто отслеживать, сколько у вас предметов в буфере. Если он ниже минимального, вы будете загружать больше, Firebase выполняет все операции загрузки в фоновом режиме, поэтому не стоит беспокоиться об этом. Вы также можете использовать блокировки на счетчиках для автоматизации загрузки.

Чтобы загрузить определенную сумму из списка дочерних узлов, ознакомьтесь с запросами на базовую станцию. Они используются для сортировки возвращаемых вами узлов, а также для получения узлов по определенным индексам.

Однако это не решит вашу проблему с потенциально удаленными узлами в любой момент. Для этого вы можете попытаться вычислить хэш текущего просматриваемого элемента и сравнить его с хеш-таблицей элементов, которые были просмотрены в текущем сеансе. Если совпадение найдено, этот элемент уже был просмотрен, и в базе данных произошла некоторая перетасовка индексов. (т. е. элемент был удален)

Просто мысль.