Пользовательский интерфейс iOS не отвечает во время viewdidappear

У меня есть представление таблицы, и когда пользователь выбирает строку, я нажимаю их на новый ViewController. Сначала я инициализировал все свои объекты представления в методе ViewDidLoad (включая вызовы веб-службы), но я увидел, что переход от моего табличного представления к моему новому контроллеру представления очень долгий.

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

Однако я не могу нажимать какие-либо кнопки на панели навигации в верхней части экрана (например, кнопку «Назад»), пока не завершится мой метод ViewDidAppear и не загрузится пользовательский интерфейс.

Какое решение для этого? Есть ли другой способ загрузить мой пользовательский интерфейс, не мешая пользователю взаимодействовать с кнопками в моей панели навигации?

Спасибо!!


person user1467188    schedule 12.07.2012    source источник
comment
Вы пытались выполнить инициализацию в ViewWillAppear?   -  person lu yuan    schedule 12.07.2012
comment
да, я пробовал. это замедляет мой переход от tableview к новому ViewController, что мне не нравится. Я все еще хочу плавный переход.   -  person user1467188    schedule 12.07.2012
comment
вы слишком много делаете в основной теме.   -  person Daij-Djan    schedule 02.06.2014


Ответы (3)


Попробуйте инициализировать пользовательский интерфейс в фоновом режиме, используя следующий метод.

[self performSelectorInBackground:@selector(initYourUI) withObject:yourObj];

Вы можете вызвать это в ViewDidLoad

person lu yuan    schedule 12.07.2012
comment
Работа с пользовательским интерфейсом в фоновом режиме может привести к сбоям. Так что это не очень хорошая идея. - person Daniel; 02.06.2014

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

Касайтесь пользовательского интерфейса только в основном потоке. (Обратите внимание, что иногда это может показаться безопасным, но в конечном итоге это всегда приводит к странным проблемам)

один простой способ - использовать GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
    //insert web service requests / computations / IO here 

    dispatch_async(dispatch_get_main_queue(),^{
        //back to the main thread for UI Work
    });
});
person Daij-Djan    schedule 02.06.2014

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

//create new queue
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.siteName.projectName.bgqueue", NULL);

//run requests in background on new queue
dispatch_async(backgroundQueue, ^{
    //insert web service requests here
});

Вот более подробное руководство:

http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial

person Matt Cooper    schedule 02.06.2014
comment
это удержало бы их в основной ветке - я не думаю, что вы это имели в виду - person Daij-Djan; 02.06.2014
comment
@Daij-Djan Дайдж-Джан. Вы правы, спасибо, теперь это должно быть исправлено. - person Matt Cooper; 03.06.2014