IGListKit с разделами и несколькими элементами

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

Для этого я создал объект источника данных, соответствующий IGListDiffable которые представляют каждый раздел как таковой:

final class DataSource: NSObject {
  var title: String?
  var items: [SJResult] = []
}

extension DataSource: IGListDiffable {
  public func diffIdentifier() -> NSObjectProtocol {
    return self
  }

  public func isEqual(toDiffableObject object: IGListDiffable?) -> Bool {
    if object === self {
      return true
    }
    guard let obj = object as? DataSource else {
      return false
    }
    return obj.items.count == items.count
  }
}

Внутри каждого раздела я хотел бы отобразить список items, Мне удалось создать раздел, используя тот же контроллер раздела, но я нашел единственный способ вставить новый результат - сделать вызов reloadData() на адаптере. Это довольно плохо, поскольку перезагрузит полный список элементов (который может быть очень длинным, >50 элементов). Это также не дает возможности анимировать вставку нового элемента. Я также пытался сделать adapter.performUpdates(animated: true) без удачи, так как он только обновляет мой источник данных, но не элементы внутри источника данных.

Затем я попытался создать контроллер раздела, который будет отображать каждый раздел с одной ячейкой. Ячейка будет содержать IGListCollectionView и позаботится о отображении items, но с этим мне не повезло, так как, несмотря на то, что второй контроллер секции получает объекты, он никогда не отображает ячейки.

Сейчас я немного переживаю и не уверен, как я мог бы отобразить три разных раздела, которые используют один и тот же тип ячеек с IGListKit, с помощью статических разделов и динамических элементов. Я думаю о создании трех IGListCollectionView и установить нижние / верхние ограничения между ними, но у меня есть некоторые сомнения в возможности сделать это.

Мне интересно, если кто-то уже сталкивался с подобной проблемой и / или парни из IGListKit могли бы дать мне несколько советов о том, что является лучшей реализацией для решения этой проблемы?

1 ответ

Вы должны возвращать уникальные экземпляры контроллеров секций для каждого объекта. Не используйте их повторно!

Еще одна вещь, которую стоит отметить, это то, что вы используете self как идентификатор diff, который означает, что экземпляр объекта идентифицирует его уникальность. Это означает, что два DataSource объекты никогда не будут сравниваться (obj.items.count == items.count никогда не случится). Не нарушитель соглашения, но просто имейте в виду, что так оно и будет себя вести.

Вы также можете взглянуть на IGListBindingSectionController который берет вашу оригинальную модель и разбивает ее на модели моделей, которые управляют каждой ячейкой в ​​разделе.

Более подробная информация и пример в запросе на получение. Обратите внимание, что это требует использования мастера, если вы используете CocoaPods.

https://github.com/Instagram/IGListKit/pull/494

Другие вопросы по тегам