Наиболее эффективный способ обработки ячеек UITableView разного размера и эффективного извлечения связанных данных

#objective-c #uitableview #core-data #nsfetchedresultscontroller

#objective-c #uitableview #основные данные #контроллер nsfetchedresultscontroller #core-data #nsfetchedresultscontroller

Вопрос:

Всем привет, я был бы очень признателен за помощь в этом — я стремлюсь к высокой эффективности при извлечении данных w.r.t и использовании памяти.

У меня есть основное хранилище данных, в котором хранятся элементы таблицы содержимого (tocEntity): название статьи, номер страницы. На странице может быть несколько статей, а номера страниц могут существовать или нет, т.Е. Если у вас есть статья на 5 страницах, начинающаяся со страницы 3, у вас не будет никаких записей t.o.c. для страниц 4-7.

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

Нет проблем с правильным размещением ячеек, но я заинтересован в эффективной выборке данных только для того, что в данный момент необходимо для представления таблицы (способ, которым работает NSFetchedResultsController) — проблема в том, что на ячейку приходится не 1 ввод основных данных, а довольно разные количества. Итак, если NSFetvhedResultsController скажет (получите мне данные для ячеек 12-17) — это не приведет к извлечению данных из одного ядра.

Есть идеи, как это реализовать?

Ответ №1:

В viewDidLoad извлеките все данные в NSArray затем используйте этот массив в UITableView методах источника данных вместо оперативных вызовов. Если вы хотите обновить данные, повторно заполните массив из данных и вызовите reloadData tableview.

Комментарии:

1. Вот как я это делаю, но это решение совсем не экономит память и не масштабируется — возможно, что только 1% от общего объема данных может отображаться на экране за один раз…

2. К сожалению, способ работы Apple code (как вы обнаружили) заключается в том, что он вызывает одни и те же методы МНОГО раз при рендеринге. Единственное, что вы могли бы сделать, это ограничить количество строк, а затем обнаружить прокрутку и вставить строки в таблицу и т.д., Но я бы не рекомендовал этого.

3. Также стоит отметить, что ошибка в CoreData, что означает, что даже если у вас есть объекты core data в массиве, вы НЕ храните ВЕСЬ объектный граф в памяти, когда вы обращаетесь к свойству объекта, он выдает ошибку, что приводит к тому, что CoreData извлекает эти данные, это довольно эффективно.

Ответ №2:

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

Комментарии:

1. Я рассматривал это — но это приведет к таблице со многими разделами из одной ячейки (более распространенными, чем многострочные), что будет выглядеть довольно неуклюже? Есть ли какой-либо способ объединить каждую секцию с предыдущей, т. Е. не иметь разрыва между секциями?

2. Я не совсем понимаю, о каком разрыве вы говорите. Если проблема с разделами, вы можете попробовать использовать строку без отступа для представления страницы, за которой следуют строки с отступом, представляющие ссылки на страницы.

3. Выполняете ли вы итерацию по всему массиву результатов, чтобы сгруппировать названия статей по страницам? Если это так, то каждый объект в массиве отключается при обращении к его свойству. Для повышения производительности вам нужно определить способ возврата объектов, уже отсортированных и сгруппированных для отображения. Что касается разделов, вы также можете вернуть пользовательский вид для разделов таблицы, который может включать треугольник раскрытия и т.д.