Устранение отклоненияПросмотрСообщение: завершение: имеет пару секунд задержки - программирование
Подтвердить что ты не робот

Устранение отклоненияПросмотрСообщение: завершение: имеет пару секунд задержки

cancelViewControllerAnimated: завершение: отлично работает в моем приложении, за исключением задержки между увольнением.

[api loginWithUsername:[dict objectForKey:@"username"] andPassword:[dict objectForKey:@"password"] andSuccessBlock:^(id json) {
    NSLog(@"DONE... %@", [json objectForKey:@"status"]);
    NSString *status = [json objectForKey:@"status"];
    if([status isEqualToString:@"ok"]){
        app.user = [json objectForKey:@"data"];
        [self dismissViewControllerAnimated:YES completion:nil];
    }else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"could not log you in" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    }
}];

В моей консоли я вижу echo'ed "DONE... ok", что означает, что блок обратного вызова был выполнен, однако через 3-4 секунды модальное представление окончательно отклонено.

Что может вызвать эту задержку?

4b9b3361

Ответ 1

Если вы не гарантируете, что ваш код пользовательского интерфейса запущен в основном потоке, он может работать на каком-то другом, и в этом случае вы будете испытывать задержку в несколько секунд!

Вы можете добавить это, чтобы убедиться, что увольнение выполняется в основном потоке:

dispatch_async(dispatch_get_main_queue(), ^{
    [self dismissViewControllerAnimated:YES completion:nil];
});

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

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

Ответ 2

check 'viewWillAppear' в ParentViewController и 'viewWillDisappear' текущего контроллера. Удостоверьтесь, что эти две функции не имеют тяжелых вычислений и распределений памяти внутри.

Ответ 3

Попробуйте изменить

NSString *status = [json objectForKey:@"status"];
NSLog(@"DONE... %@", status);

а затем попробуйте

if ([status isEqualToString: @ "ok" ]) {

    [self dismissViewControllerAnimated:YES completion:nil];
    app.user = [json objectForKey:@"data"];
}else{

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