2013-02-26 2 views
2

Я создаю модуль входа, в котором учетные данные, введенные пользователем, проверяются в бэкэнд-системе. Я использую асинхронный вызов для проверки учетных данных и после аутентификации пользователя. Переходим к следующему экрану, используя метод presentViewController:animated:completion. Проблема в том, что запуск метода presentViewController занимает абонентское время, пока не появится следующий экран. Боюсь, что мой предыдущий вызов sendAsynchronousRequest:request queue:queue completionHandler: каким-то образом создает побочный эффект.UIViewController presentViewController: анимированный: завершение - от 4 до 6 секунд для запуска

Просто, чтобы убедиться, что, когда я говорю 4-6 секунд, после запуска команды presentViewController:animated:completion. Я говорю это, потому что я отлаживаю код и отслеживаю момент вызова метода.

Во-первых: метод NSURLConnection называется:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; 

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 

Второе: UIViewController метод вызывается с ненормальное время работы

UIViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstView"]; 

[self presentViewController:firstViewController animated:YES completion:nil]; 

Любая помощь оценена.

спасибо, Маркос.

+0

Так вы вызываете код презентации из блока завершения? –

+0

да, я звоню из блока завершения – vilelam

ответ

10

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

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstView"]; 
     [self presentViewController:firstViewController animated:YES completion:nil]; 
    }); 
} 

Это гарантирует код выполняется в главном потоке.

+0

Спасибо Карлу! Ты мужчина! Это сэкономило мне много времени. – vilelam

+0

@vilelam спасибо, рад, что это помогло! –

Смежные вопросы