как «подготовить» вид в фоновом режиме? - PullRequest
2 голосов
/ 08 июня 2011

У меня есть два представления, первое - это простое представление с некоторым введением в использование и нажатием кнопки открывается главный вид. Основное представление имеет много изображений, а две настраиваемые таблицы со строками состоят из текста и изображения, поэтому создание основного представления выполняется довольно медленно. Профилировщик показывает, что большую часть времени занимает imageIO (decode_mcu, png_read_filter_row, pmap_copy_page и depress_onepass)

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

Я попытался выделить и инициализировать основное представление в viewDidLoad первого представления

- (void)viewDidLoad
{
    [super viewDidLoad];
    rootVC = [[RootViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    rootVC.delegate = self;


}

и сделайте это в методе действия кнопки

- (IBAction)buttonUp:(id)sender {
    [self.view addSubview: rootVC.view];
}

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

Спасибо

Leo

Ответы [ 2 ]

8 голосов
/ 08 июня 2011

Вы должны:

  1. Используйте инструменты, чтобы увидеть, где ваш код тратит больше всего времени, и оптимизировать там. Это может быть не там, где вы думаете.

  2. Если вы используете UITableView, узнайте, как создавать UITableViewCells по требованию (вместо предварительной загрузки большого числа) и перезаписывать экземпляры (а не создавать их заново).

  3. Только если Instruments указывает на это как узкое место: попробуйте загрузить / распаковать изображения в фоновой очереди, затем обновить UIImageView (или любой другой) в основной очереди после загрузки.

В iOS 4.x или более поздней версии вы можете сделать это:

NSString *path = ...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
    // This is happening in the background thread.
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    dispatch_async(dispatch_get_main_queue(), ^{
        // This is happening on the main thread; all UI updates must happen here.
        imageView.image = image;
    });
});

P.S. Кстати, UIViewController загружает представление не при создании, а по требованию. Итак, исходя из вашего кода выше, выражение rootVC.view, вероятно, запускает представление для загрузки. Если вы хотите принудительно загрузить его раньше, просто поместите rootVC.view в другое место.

4 голосов
/ 08 июня 2011

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

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

@ benzado дает несколько хороших указателей для повышения производительности.Попытка противостоять Cocoa-Touch - это всегда рецепт боли, поэтому вместо этого постарайтесь выяснить , почему ваш взгляд так долго загружается.Где ваше приложение тратит все это время?Что вы можете сделать, чтобы уменьшить эту нагрузку?

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