Поскольку в настоящее время FirebaseUI FUICollectionDataSource
обрабатывает все изменения пользовательского интерфейса, я использую FUIArray
и наблюдаю за изменениями в источнике данных, а также вручную обновляю свой collectionView. Однако на второй взгляд я считаю, что мне следовало реализовать FUIIndexArray
из-за его поведения упорядочивания. Однако я не уверен, что это два запроса инициализации.
Из документов:
- @param index Запрос базы данных Firebase, дочерние ключи которого являются дочерними по отношению к запросу данных.
- @param data Ссылка на базу данных Firebase, дочерние элементы которой будут извлечены и использованы для заполнения содержимого массива в соответствии с индексный запрос.
Для параметра данных я использую тот же запрос, который я использовал с FUIArray
(который работал). Что касается параметра индекса, я не был уверен, что использовать, поэтому я использовал тот же запрос для тестирования, и он, похоже, наполовину работает. В обоих запросах я сортирую по приоритету. Если я проверю длину FUIIndexArray
, я получу правильное количество, но когда я проверю его .items
, массив будет пуст.
Должен ли FUIIndexArray
работать аналогично FUIArray
, за исключением того, что он также возвращает индекс? Как должен выглядеть индексный запрос?
1 ответ
Похоже, есть некоторая путаница в том, что на самом деле должен делать FUIIndexArray
. FUIIndexArray
использует ключи дочерних элементов запроса индекса для загрузки дочерних элементов из запроса данных, что означает, что загрузка каждого элемента становится асинхронной, и .items
не будет ничего возвращать, если ни одна из этих загрузок не завершена (хотя возможно, он должен вернуть здесь массив, полный NSNull
).
FUIIIndexArray
был разработан, чтобы упростить загрузку очень детализированных разделов больших наборов данных за счет выполнения запроса, чтобы точно указать, какие элементы должны быть загружены. Скажем, ваша база данных выглядит так:
// An index to track Ada's memberships
{
"users": {
"alovelace": {
"name": "Ada Lovelace",
// Index Ada's groups in her profile
"groups": {
// the value here doesn't matter, just that the key exists
"techpioneers": true,
"womentechmakers": true
}
},
...
},
"groups": {
"techpioneers": {
"name": "Historical Tech Pioneers",
"members": {
"alovelace": true,
"ghopper": true,
"eclarke": true
}
},
...
}
}
Если и users
, и groups
представляют собой очень большие наборы данных, вы захотите иметь возможность выборочно загружать только те группы, к которым принадлежит конкретный пользователь. FUIIndexArray
решает именно этот вариант использования (и ничего больше).
let adasGroups = database.reference(withPath: "users/alovelace/groups")
let allGroups = database.reference(withPath: "groups")
// array will load only alovelace's groups
let array = FUIIndexArray(index: adasGroups, data: allGroups, delegate:self)
Поскольку каждый элемент должен загружаться индивидуально, FUIIndexArrayDelegate
предоставляет обратный вызов для обработки каждой загрузки индивидуально, и реализация этого обратного вызова для правильной обработки как успешных загрузок, так и ошибок может добавить фрактальной сложности вашей кодовой базе. Вам следует избегать использования FUIIndexArray, когда вы можете, и придерживаться гораздо более простого FUIArray, особенно если ваши потребности в ограничении запросов могут быть удовлетворены без индекса.
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.