Поскольку в настоящее время FirebaseUI FUICollectionDataSource обрабатывает все изменения пользовательского интерфейса, я использую FUIArray и наблюдаю за изменениями в источнике данных, а также вручную обновляю свой collectionView. Однако на второй взгляд я считаю, что мне следовало реализовать FUIIndexArray из-за его поведения упорядочивания. Однако я не уверен, что это два запроса инициализации.

Из документов:

  • @param index Запрос базы данных Firebase, дочерние ключи которого являются дочерними по отношению к запросу данных.
  • @param data Ссылка на базу данных Firebase, дочерние элементы которой будут извлечены и использованы для заполнения содержимого массива в соответствии с индексный запрос.

Для параметра данных я использую тот же запрос, который я использовал с FUIArray (который работал). Что касается параметра индекса, я не был уверен, что использовать, поэтому я использовал тот же запрос для тестирования, и он, похоже, наполовину работает. В обоих запросах я сортирую по приоритету. Если я проверю длину FUIIndexArray, я получу правильное количество, но когда я проверю его .items, массив будет пуст.

Должен ли FUIIndexArray работать аналогично FUIArray, за исключением того, что он также возвращает индекс? Как должен выглядеть индексный запрос?

2
Ulises Giacoman 19 Дек 2016 в 15:46

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, особенно если ваши потребности в ограничении запросов могут быть удовлетворены без индекса.

3
Morgan Chen 19 Дек 2016 в 21:37
Большое спасибо за отличное объяснение!
 – 
Ulises Giacoman
19 Дек 2016 в 22:28
Большое спасибо и от меня, это один из самых исчерпывающих ответов, которые я когда-либо видел на SO :)
 – 
manmal
23 Мар 2017 в 13:21