Почему простой модальный контроллер представления будет отставать, когда он представлен и отклонен?


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

Модальный вид анимируется плавно, но после загрузки он замирает на 3 секунды, а затем реагирует нормально. После отклонения вида (также плавно анимируется), мой контроллер выбора изображений делает паузу в течение 2 секунд, а затем возобновляет работу в обычном режиме.

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

Мою проблему можно решить, ответив:

  • какие методы делегата вызываются в презентаторе, когда показывается модальное представление?
  • (Если есть ^) как я могу не вызывать эти методы или сделать их более плавными?
  • какие общие подводные камни связаны с модальными контроллерами вида?
3 2

3 ответа:

Это, вероятно, потому, что вы делаете много обработки в основном потоке (обычно, когда пользовательский интерфейс останавливается, это потому, что обработка основного потока). Попробуйте предоставить нам какой-нибудь код, в частности тот, который вы считаете самым тяжелым кодом обработки! Извините за мой бедный английский: P! Попробуйте отправить самый тяжелый код в другой поток с помощью

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //your heavy code here =)
});

С уважением, Лукас

Вызывается несколько методов. ViewDidLoad ViewWillAppear ViewDidAppear ViewWillDisappear ViewDidDisappear. Проверьте все эти методы. Кроме того, проверьте все созданные вами подвиды и посмотрите, делают ли они что-либо в своем потоке, включая загрузку изображений в указанных мною методах. Также ли это происходит в симуляторе, а также в тестовом устройстве?

ModalViewControllers не имеют слишком много подводных камней, но понимание того, сколько представлений выделяется на таких вещах, как стеки навигации и сколько у вас видов друг на друга сверху. Когда вы избавляетесь от модального viewcontroller, вы вызываете dismissviewcontroller?

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

BProfileTableViewController * _profileViewController = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:profileViewController];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

Здесь вы можете видеть, что если это на tableView нажмите, то каждый раз приложение должно создать viewController снова. Если вместо этого мы просто повторно используем представление, то оно избавляется от некоторой части этого отставания.

Добавьте это в заголовочный файл

BProfileTableViewController * _profileView;

Затем код загрузки модального представления изменяется на:

// Open the users profile
if (!_profileView) {
    _profileView = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
}

UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:_profileView];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

Это означает, что мы просто перезагружаем представление вместо воссоздания вида