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 ответа

Решение

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

Возможные причины:

  1. Запуск анимации изнутри viewDidLoad, viewWillAppear или подобный метод - до того, как представление фактически отображается.
  2. Показ / скрытие UIAlertView когда другой UIAlertView анимация все еще работает. Это включает показ предупреждения от alertView:didDismissWithButtonIndex:,
  3. Столкновение между анимацией модального вида и анимацией оповещения.
  4. Столкновение между UINavigationController анимация push/pop и анимация оповещений.

Ваш случай: вы, вероятно, скрываете свое предупреждение даже до того, как оно будет полностью отображено, и вы получаете столкновение между двумя анимациями. Показ анимации обычно занимает около 0,4 секунды, но ваш ответ может прийти намного раньше - активировать скрытую анимацию.

Возможное решение:

  1. Запрос запуска по окончании анимации (didPresentAlertView).
  2. Измерьте продолжительность вашего соединения и, если оно короче, чем 0,4 секунды, задержите скрытие анимации.

Вы не должны делать анимации, если View Controller, на котором происходит эта анимация, не появился. Так что никакой анимации в viewDidLoad нет. Попробуй во viewDidAppear. Это безопаснее. Посмотрите здесь.

Надеюсь это поможет.

Ура!

Другие вопросы по тегам