Ускорьте загрузку пользовательского интерфейса с NIB на iPhone - PullRequest
2 голосов
/ 18 мая 2010

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

В основном у меня есть

viewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
viewController.view;

где MyViewController.xib - довольно сложный файл пера с множеством переплетенных контроллеров и представлений, некоторые из которых, конечно, загружают свои представления и иерархии из других перьев, но, конечно, не все. Загрузка занимает около 7 секунд, что очень долго, учитывая, что это приложение для iPhone.

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

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

Ответы [ 2 ]

3 голосов
/ 18 мая 2010

Первое, что нужно сделать, это не предполагать, что загрузка пера является узким местом без прямых доказательств того, что это так. Загрузка пера высоко оптимизирована и очень эффективна. Более вероятно, что вашим узким местом является сетевой запрос, а не перья. Используйте инструменты, чтобы получить конкретные данные о том, где приложение тратит свое время, прежде чем что-либо делать.

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

Похоже, вам нужно разбить большой перо на более мелкие.

Как правило, на перо можно смотреть по одному. Например, предположим, что у вас есть приложение с панелью вкладок с пятью вкладками. Тогда каждая вкладка имела табличное представление, которое открывало бы подробное представление. В обычной настройке у вас будет 11 отдельных перьев. Один кончик будет определять панель вкладок, один кончик для просмотра каждой вкладки, а затем один кончик для подробного просмотра. Когда приложение запускалось, загружались только перо для панели вкладок и первой видимой вкладки, поэтому для запуска вам нужно было загрузить только два из 11 перьев.

Чтобы оптимизировать, первое, что нужно сделать, это разбить его на наименьшие возможные отдельные кончики. Перо загружается только при необходимости. Вы должны разместить функциональность по всему пиру так, чтобы он не загружался, если его вид не отображается сразу.

Перья - это просто легкие файлы данных, поэтому не бойтесь создавать перья, которые на 99% идентичны. Например, я часто использую отдельные виды для каждого портретного и ландшафтного вида. С точки зрения пользователя, это один вид, но у меня есть три отдельных кончика. Я делаю это в тех случаях, когда проще использовать совершенно отдельный вид, чем поворачивать один сложный вид. Каждый кончик загружается, когда используется его ориентация. Если ориентация никогда не меняется, она никогда не загружается.

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

1 голос
/ 18 мая 2010

Я понятия не имею, будет ли это действительно работать, но вы можете поместить операторы регистрации в initWithCoder в каждом контроллере, который будет вызываться при загрузке каждой суб-XIB. Это может дать вам некоторые подсказки.

Я думаю, инструменты не дают вам ничего полезного?

...