2011-01-20 2 views
8

Я использую NSFetchedResultsController для реализации KVO для моего UITableView (что очевидно). Я не могу понять, как использовать несколько Entities - вид древовидной структуры - одновременно присутствовать (ed).NSFetchedResultsController - KVO, UITableView и «Tree»

Вот мои настройки:

  • Entity1
    • отображаемое_имя
    • RelationToEntity2
  • entity2
    • отображаемое_имя

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

  • Entity1 (вход 1)
  • entity2 (вход 1)
  • entity2 (вход 2)
  • ...
  • entity1 (вход 2)
  • ...

Хотя это может выглядеть как вещь в делать через разделы, это не так. Оба объекта должны быть UITableViewCells. Может ли кто-нибудь указать мне правильное направление, чтобы сгладить, не потеряв фактическую иерархию.

+0

Я не верю, что вы можете сделать это напрямую с помощью NSFetchedResultsController; вам нужно будет создать промежуточную модель, характеристики которой будут зависеть от количества элементов, которые у вас есть в вашем конечном представлении таблицы. Из вашего примера также не ясно, как вы переходите от своей древовидной структуры к сплющенному виду - не могли бы вы предоставить что-то более полное? – hatfinch

+0

Реальная проблема заключается в том, как я получаю сплющенную структуру от дерева. В моем табличном представлении не известно, сколько предметов будет - все это делается NSFetchedResultsController. Я мог бы создать промежуточную модель, но это то, чего я действительно не хочу делать. – gamma

ответ

1

Похоже, вам нужно поддерживать собственный «сплющенный» источник данных. Возможно, следующее будет работать:

Когда NSFetchedResultController говорит вам новый Entity1 была вставлена, вставить Entity1 и связанные с ним Entity2 S в скажем, _flattenedArray так это выглядит следующим образом:

[<Entity1>, <related Entity2>, <related Entity2>...]

Где вы вставьте их до вас - это в значительной степени сводится к:

  1. построить подмассива, содержащий новый Entity1 и связанных с ними Entity2 объектов
  2. решить, где находится _flattenedArray, чтобы вставить новый подрамник.
  3. вызов reloadData или другие средства для информирования tableView новых данных

Когда Entity1 объект удаляется, удалите его и все последующие Entity2 объекты, пока вы не столкнетесь с конца _flattenedArray или запустить в другой Entity1 объект , Это предполагает, что Entity2 никогда не является объектом «верхнего уровня». Если вам нужно будет удалить только те объекты Entity2 в отношении.

Когда Entity1 получает объект или теряет Entity2 объект, вы можете сначала удалить Entity1 объект из _flattenedArray затем вставив его. Если это слишком эффективно, сделайте слияние вместо этого.

+0

Это звучит разумно и является одной из вещей, о которых я думал. Как насчет объема памяти? У меня всегда будут двойные данные в моей памяти, не так ли? Решением к этому может быть только получение обломочного корпуса Entities. – gamma

+0

Вы не будете - NSArray хранит ссылки на объекты, а не копии объектов. Если они поступают из CoreData, это NSManagedObjects, что означает, что они могут даже не быть в памяти до тех пор, пока вы не получите доступ к ее атрибутам или какой-либо другой операции, которая приведет к их повреждению в памяти. – freespace

+0

Я сделал это так, и, похоже, все нормально. Предостережение заключается в том, что я в какой-то момент должен позаботиться о повторном заполнении простого списка, когда KVO обновляет данные, и это еще не совсем сделано. – gamma

0

Это именно то, что нужно для наследования объектов. При извлечении родительского абстрактного объекта с выбранным контролером результатов все дочерние объекты могут отображаться в таблице. Используйте свойство заказа раздела, чтобы отображать разделы в том порядке, в котором вы предпочитаете. И используйте второе свойство сортировки для заказа внутри разделов. Приложение Notes делает это, выбирая абстрактную сущность Контейнера и отображает «Учетные записи и папки», которые являются дочерними объектами. Это разделы по учетной записи и первой папке «Все iCloud» - это фактически учетная запись. Папки имеют отношение к учетной записи, даже если они равны в дереве наследования объектов.

Смежные вопросы