tableView reloadData для фильтрации данных - PullRequest
0 голосов
/ 11 декабря 2011

В качестве дополнительного вопроса к предыдущему сообщению: фильтрация контента для UITableView

При фильтрации набора данных для UITableView, предполагая, что я использовал NSPredicate в соответствии с рекомендацией в предыдущем посте,выглядит ли общая идея следующим образом:

NSArray *allData;
NSMutableArray *filteredData;
  • Когда нажата кнопка фильтра, используйте NSPredicate для заполнения
  • FilterData Перезагрузите таблицу с помощью [tableView reloadData];

В моих методах источника данных tableView и делегата я бы в основном проверил, была ли кнопка фильтра включена, и отображала ли отфильтрованные данные, если нет - show allData.

В чем я не уверенВ одном из видеороликов WWDC 2010 о табличных представлениях говорится, что reloadData - дорогостоящая операция, и вместо этого вам следует обновить свое представление, используя методы вставки / удаления / замены для tableView.А анимация также дает пользователю контекст того, что происходит.Так что, если это так, вы все еще используете reloadData?Я не могу понять, как tableViews будет знать, что показывать, если фильтр включен и reloadData не вызывается.Я предполагаю, что вам придется перезагрузить данные, если фильтр был включен, а затем также обновить представление с помощью методов вставки / удаления / замены для анимации, если вы хотите дать пользователю некоторый контекст происходящего.Это правильно?Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2011

Если я правильно вас понимаю, набор данных не изменяется только в порядке, в котором он отображается (Фильтровано). Если это так, то вызов данных перезагрузки - правильная вещь. Использование вставки / удаления / удаления анимации в первую очередь для редактирования табличного представления (в режиме редактирования). Или при получении «больше» данных или обновлений данных (например, из iCloud). Я обнаружил, что вызов данных перезагрузки в табличном представлении стоит дорого, если источник данных очень большой с некэшированными изображениями или некоторыми другими большими данными с медленным чтением (как в спокойных вызовах XML для удаленных серверов). Если вы имеете дело в основном с текстом и / или небольшими кэшированными изображениями, это не должно быть проблемой. Если фильтрация удаляет или добавляет элементы в ваш массив, вам необходимо отследить, где они находятся в табличном представлении, по пути индекса, удалить их, а затем добавить новые фрагменты. Хранение более одного массива для одного источника данных намного дороже, учитывая платформу. Управление памятью является приоритетом, когда мы имеем дело с iOS, ИМХО.

Еще одна вещь, на которую следует обратить внимание, это фактическая вставка и / или удаление строк или разделов должно быть внутри анимационного блока, начиная с [beginUpdates] и заканчивая [endUpdates]. Если вы не делаете это изнутри методов делегирования редактирования.

0 голосов
/ 11 декабря 2011

Я думаю, что в видео WWDC 2010 говорилось, что если вы можете и / или если ваше приложение имеет проблемы с производительностью, вы должны использовать вставку / удаление / замену вместо reloadData. Но он не соответствует вашим потребностям при включении / выключении фильтра.

Чтобы делать то, что вы хотите, я думаю, что reloadData - это хорошо. Если вы действительно хотите пропустить reloadData, вы можете использовать CoreData и NSFetchedResultsController с предикатом, используя атрибут «visible», который вы устанавливаете в true или false, в зависимости от текущего значения фильтра (а затем вы можете использовать уведомления NSFetchedResultsController для приятной анимации ваших изменений ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...