我应该在每个UIViewController中监听可达性更新吗?

9
我看到很多可达性的例子,人们只在可达性状态改变时显示消息。但最近我在Foursquare应用程序中看到,他们每次用户尝试执行需要互联网连接的操作时都会显示一条消息。我认为这更加健壮,也更好的用户体验,提醒用户没有互联网就无法进行任何操作。主要是因为用户可以在应用之间切换,做其他事情,当他回来时忘记了他没有连接。
同时,一旦他们恢复了连接,我可以看到他们从互联网获取数据并刷新UI。
我真正想知道的是如何以最佳方式实现这一点。怎么做?他们是否有一个通用的UIViewController,在每次需要连接时检查可达性?还是在每个Internet请求之前都有一种代理类取消请求并显示消息?你们是如何处理这个问题的?
谢谢。
编辑:
我想出的解决方案是使用AFNetworking,它也在盒子里提供可达性状态。基本上,我创建了一个AFHTTPClient,并在其上设置了一个可达性回调块来监听状态更改。AFHTTPClient对象是应用程序范围的(一种单例)。 (实际上,我对于每个需要访问的主机都有一个AFHTTPClient:a.com,b.com ...)。
然后,当我需要执行请求时,我创建一个新的AFHTTPRequestOperation(在我的情况下是AFJSONRequestOperation),并将其排队到我的AFHTTPClient对象上。在操作的失败块中,我检查使用AFHTTPClient的networkReachabilityStatus属性是否可达主机。如果不可达,我向用户显示没有互联网连接的消息。
我将其封装起来,以便每次创建操作时都不必这样做。因此,现在在应用程序中,每当用户在没有连接时尝试做某事时,他都会收到一条消息,提醒他没有互联网访问权限。我还使用可达性回调来重新加载屏幕上的数据,一旦我恢复了连接(或者说一旦我应该有连接)。
我不知道这是否是最佳实践,但我认为知道应用程序在新连接可用时立即重新加载重要数据是很好的。
如果有人对示例代码感兴趣,我可以提供它。
1个回答

18
今年的WWDC演讲中,苹果工程师建议用户不要仅基于Reachability示例应用程序状态来确定应用程序的互联网访问。通常情况下,可达性并不能提供完整的信息(它基于一种复杂的机制),该工程师提出了以下建议:
1. 尝试进行您的Internet连接,无论Reachability状态如何;然后根据成功/失败结果设置您的UI提示。 2. 如果由于网络问题而失败,则在注册到Reachability并在Reachability发出绿色信号时再次重试;这是在您想要从故障条件中自动恢复时所需的。 3. 在任何情况下都给用户“强制重试”的可能性,无论Reachability状态如何。如果成功,则立即重置您的UI提示。
苹果工程师所说的是完全正确的:很多时候您可以在控制台日志中看到可达性失败消息,而互联网连接仍然完好无损。
另一件事:没有比状态栏中显示的“网络提示”更好的了:如果您在那里有Wi-Fi图标、3G / 4G图标、蜂窝场强。
回到您最初的问题:没有绝对更好的方法来管理此类内容,这严重取决于应用程序架构。如果您喜欢将网络处理集中在一个专用类中(不是UIViewController而是NSObject子类),那么定义一个只读属性可能有意义,该属性在最新的应用程序与服务器的互联网连接后更新为“成功/失败”(Ping其他服务器(如Google或Apple)没有意义:首先它不够优雅,其次问题可能来自提供应用程序的服务器而不是设备的互联网连接状态!)。
@property (readonly) BOOL lastConnectionToMyServerSuccess
那么你的视图控制器可以通过 KVO 或中央通知注册这个属性的变化,并通过显示图标或其他方式相应地更新它们的用户界面(我再强调一遍:要留给用户手动尝试连接到互联网的可能性)。当视图控制器不可见时("viewWillDisappear:")、未加载时("viewDidLoad:")或被释放时,应取消 KVO 的注册。

当然,这会增加一些额外的复杂性。例如:您使用应用程序,互联网指示灯为绿色。然后,您将其挂起,做其他事情,几分钟后返回应用程序。在这种情况下,应用程序应该 ping 服务器以再次恢复互联网指示灯的状态,因为经过几分钟后,网络条件可能已经发生了变化(例如,您正在火车上)。无论如何,所有已加载的视图控制器都会从网络专用类接收到 KVO 通知并更新自己的界面。


非常感谢您的回答,您还记得这是哪个WWDC演讲/视频吗? - grandouassou
不确定是否记得。请尝试会话706和225(会话的第二部分)。 - viggio24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接