UIAlertView, NSURLConnection и wait_fences
Я пытаюсь отобразить UIAlertView
с UIActivityIndicator
после того, как пользователь нажимает "войти" в контроллере модального представления. Для входа учетные данные отправляются на сервер с помощью sendAsynchronousRequest:queue:completionHandler:
от NSURLConnection
учебный класс. Моя реализация выглядит следующим образом:
UIAlertView * spinner = [[UIAlertView alloc] initWithTitle:@"Connecting to server..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
[spinner show];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.center = CGPointMake(spinner.bounds.size.width * 0.5f, spinner.bounds.size.height * 0.5f+5.0f);
[indicator startAnimating];
[spinner addSubview:indicator];
[indicator release];
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * res, NSData * data, NSError * err) {
[spinner dismissWithClickedButtonIndex:0 animated:YES];
[spinner release];
...
}
Кажется, это работает нормально, если сервер недоступен или сервер работает медленно, но если сервер отвечает немедленно, счетчик, по-видимому, не отключается до тех пор, пока через 3-5 секунд после входа в консоль
wait_fences: failed to receive reply: 10004003
Я думаю, что это происходит, потому что я отклоняю модальный контроллер представления (экран входа в систему), в то время как UIAlertView
все еще показывает, но я не уверен, почему это происходит, поскольку это обычно должно быть отклонено. Я делаю что-то не так и как правильно это сделать?
2 ответа
Я видел этот журнал несколько раз - он всегда вызван неожиданным состоянием во внутренней структуре анимации или конфликтом между анимациями вида по умолчанию.
Возможные причины:
- Запуск анимации изнутри
viewDidLoad
,viewWillAppear
или подобный метод - до того, как представление фактически отображается. - Показ / скрытие
UIAlertView
когда другойUIAlertView
анимация все еще работает. Это включает показ предупреждения отalertView:didDismissWithButtonIndex:
, - Столкновение между анимацией модального вида и анимацией оповещения.
- Столкновение между
UINavigationController
анимация push/pop и анимация оповещений.
Ваш случай: вы, вероятно, скрываете свое предупреждение даже до того, как оно будет полностью отображено, и вы получаете столкновение между двумя анимациями. Показ анимации обычно занимает около 0,4 секунды, но ваш ответ может прийти намного раньше - активировать скрытую анимацию.
Возможное решение:
- Запрос запуска по окончании анимации (
didPresentAlertView
). - Измерьте продолжительность вашего соединения и, если оно короче, чем 0,4 секунды, задержите скрытие анимации.
Вы не должны делать анимации, если View Controller, на котором происходит эта анимация, не появился. Так что никакой анимации в viewDidLoad нет. Попробуй во viewDidAppear. Это безопаснее. Посмотрите здесь.
Надеюсь это поможет.
Ура!