Резюме
Я новичок в программировании для iPhone. У меня возникли проблемы с выбором правильной стратегии оптимизации для фильтрации набора компонентов представления в виде прокрутки с огромным содержанием. В какой области мое приложение получит наибольшую производительность?
Введение
Моя текущая версия приложения для iPad позволяет пользователям исследовать довольно большие двоичные древовидные структуры. Деревья содержат от 30 до 900 узлов, и при рисовании внутри прокрутки (с ограниченным увеличением) это выглядит следующим образом.
Содержимое узлов хранится в модели базовых данных на основе SQLite. Это двоичное дерево, и если у узла есть дочерние элементы, их всегда ровно два. Позиции x и y являются частью модели, так же как и размеры узловых соединений, показанные пунктирными линиями.
Оптимизация
Только около 50 узлов помещаются на экране в любой момент времени. С самыми большими деревьями, содержащими до 900 узлов, невозможно поместить все в прокручиваемый вид, контролируемый и масштабирующий UIView, что является рецептом для сбоев. Поэтому я должен выполнить фильтрацию узлов по кадрам.
И вот тут начинаются мои неприятности. У меня нет опыта для принятия обоснованного решения между возможными вариантами фильтрации, и, кроме того, я, вероятно, не знаю об этой действительно быстрой специальной магии, скрытой глубоко в Objective-C или Cocoa Touch. Поскольку размер резервного хранилища составляет около 200 МБ (около 90 000 узлов в сотнях деревьев), тестирование каждого дерева на устройстве iPad занимает очень много времени. Вот почему я хотел бы попросить вас, ребята, за советом.
Для всех моих попыток я помещаю метод фильтра в scrollViewDidScroll: и scrollViewDidZoom :. Я также блокирую основной поток с помощью фильтра, потому что я все равно не могу показать содержимое без узлов. Но, может быть, у кого-то есть идея в этой области?
Поскольку в модели Core Data присутствует все позиционирование, я мог бы использовать NSFetchRequest для выполнения фильтрации. Это действительно быстро, хотя? У меня есть идея, что это не очень оптимизированный метод.
Из того, что я пробовал, сбойные управляемые объекты, похоже, сразу помещаются в память, но для больших деревьев может быть непросто, когда их содержимое начинает вызывать сбои. Это хорошая идея, чтобы перебрать NSSet узлов и посмотреть, какие элементы должны быть на экране?
Существуют ли другие приемы для повышения производительности? Не могли бы вы найти способы, с помощью которых я мог бы использовать многопоточность для ускорения настройки отображения, даже если контекст модели был создан в главном потоке?
Спасибо за ваш совет,
EP.