UIAlertView,NSURLConnection和wait_fences

时间:2012-07-11 10:51:21

标签: ios alertview 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 个答案:

答案 0 :(得分:3)

我多次看过这个日志 - 它总是由内部动画框架中的意外状态或默认视图动画之间的碰撞引起。

可能的原因:

  1. 在实际显示视图之前,从viewDidLoadviewWillAppear内部或类似方法启动动画。
  2. 当另一个UIAlertView动画仍在运行时显示/隐藏UIAlertView。这包括显示来自alertView:didDismissWithButtonIndex:的提醒。
  3. 模态视图动画和警报动画之间的碰撞。
  4. UINavigationController推/动画和警报动画之间的碰撞。
  5. 您的情况:您可能在完全显示之前隐藏了警报,并且您在两个动画之间发生了碰撞。显示动画通常需要大约0.4秒,但您的响应可以更早到达 - 触发隐藏动画。

    可能的解决方案:

    1. 动画结束时触发请求(didPresentAlertView)。
    2. 测量连接的持续时间,如果连接的持续时间短于0.4秒,则延迟隐藏动画。

答案 1 :(得分:0)

如果未显示正在进行该动画的View Controller,则不应该进行动画制作。所以viewDidLoad中没有动画。试试viewDidAppear。那更安全。看看here

希望这有帮助。

干杯!