UIAlertView、NSURLConnection 和 wait_fences

Posted

技术标签:

【中文标题】UIAlertView、NSURLConnection 和 wait_fences【英文标题】:UIAlertView, NSURLConnection and wait_fences 【发布时间】:2012-07-11 10:51:21 【问题描述】:

在用户在模态视图控制器中按下“登录”后,我试图显示 UIAlertViewUIActivityIndicator。要登录,凭据会使用NSURLConnection 类中的sendAsynchronousRequest:queue:completionHandler: 发送到服务器。我的实现如下:

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 仍在显示,但我不确定为什么会发生这种情况,因为它通常应该被关闭。我做错了什么吗?正确的做法是什么?

【问题讨论】:

【参考方案1】:

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

可能的原因:

    在实际显示视图之前从viewDidLoadviewWillAppear 或类似方法开始动画。 当另一个UIAlertView 动画仍在运行时显示/隐藏UIAlertView。这包括显示来自alertView:didDismissWithButtonIndex: 的警报。 模态视图动画和警报动画之间的冲突。 UINavigationController 推送/弹出动画和警报动画之间的冲突。

您的情况:您可能在警报完全显示之前就隐藏了警报,并且两个动画之间发生了冲突。显示动画通常需要大约 0.4 秒,但您的响应可以更早到达 - 触发隐藏动画。

可能的解决方案:

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

【讨论】:

感谢您的快速回复。我将研究 didPresentAlertView 方法并接受这个答案,如果这似乎可以解决它。 由于我的程序的异步特性,我用不同的方法解决了它,但问题确实是你描述的问题:我不得不再等一会儿才能调用dismiss。我现在将 dispatch_after 与包含我的旧解除代码的块一起使用,不仅我的程序响应速度更快,而且 UI wait_fences 错误也消失了!谢谢你的解释。【参考方案2】:

如果发生动画的 View Controller 没有出现,则不应制作动画。所以 viewDidLoad 中没有动画。在 viewDidAppear 中尝试。这样更安全。看看here。

希望这会有所帮助。

干杯!

【讨论】:

以上是关于UIAlertView、NSURLConnection 和 wait_fences的主要内容,如果未能解决你的问题,请参考以下文章

应用访问地图服务时系统弹出UIAlertView,可以更改UIAlertView的消息吗?

从 UIAlertView 到 UIAlertController

IOS开发之UIAlertView与UIAlertController的详尽用法说明

UIAlertView + TextField = 错误?

UIAlertView:UIAlertViewStyleSecureTextInput:数字键盘

是否可以使用标签访问 UIAlertView?