Устранение отклоненияПросмотрСообщение: завершение: имеет пару секунд задержки
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 секунды модальное представление окончательно отклонено.
Что может вызвать эту задержку?
Ответы
Ответ 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, он может занять некоторое время, чтобы ответить, и когда вы вызываете его снова после оператора журнала и делаете что-то еще, прежде чем говорить об увольнении, это может быть так.