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

我看到很多Reachability示例,其中只有当可访问性状态更改时才显示消息。
但是最近,我在Foursquare的应用程序中看到,每当用户尝试进行需要Internet连接的操作时,他们都会显示一条消息。
我认为这是更强大和更好的用户体验提醒用户,他不能做任何事情,没有互联网。 主要是因为用户可以在应用程序之间切换,做别的事情,忘记他回来时没有任何联系。
另外,只要他们获得连接,我可以看到他们从互联网获取数据并刷新UI。

我真正想要的是做到这一点的最好方法。 这是怎么完成的?
他们有一个普遍的UIViewController,每次需要连接时都检查可达性吗?
或者,在每个互联网请求取消请求并显示消息之前,他们是否有一种代理类? 你们是怎么处理的?

谢谢。

编辑:

我提出的解决scheme是使用AFNetworking,它也提供了可达性状态。
基本上我创build了一个AFHTTPClient并设置一个可达性callback块来监听状态的变化。 AFHTTPClient对象是应用程序范围的(一种单例)。 (事实上​​,我有一个AFHTTPClient每个主机我需要达到a.com,b.com …)。

然后,当我需要执行一个请求时,我创build了一个新的AFHTTPRequestOperation(AFJSONRequestOperation,在我的情况下),并将其排入我的AFHTTPClient对象。 在操作的失败块中,我检查主机是否可以通过AFHTTPClient的networkReachabilityStatus属性访问。 如果无法访问,则显示一条消息,指示用户没有互联网连接。

我把它包起来,所以我不必每次创build一个操作就这样做。 所以现在在应用程序中,每当用户在没有连接的情况下尝试做某件事时,他都会记住他没有互联网接入的信息。
我也使用可达性callback来重新加载屏幕上的数据,一旦我得到连接(或更确切地说,我应该有一个连接)。
我不知道这是否是最好的做法,但我认为很高兴知道一旦有新的连接可用,应用程序将负责重新加载重要数据。

如果有人通过示例代码感兴趣,我可以提供。

在今年的WWDC演讲中,苹果的舞台工程师build议用户不要将应用程序互联网访问的基础设置为Reachability示例应用程序状态。 通常,可达性不能提供完整的信息(它基于一个复杂的机制),工程师提供的build议是这样的:

  1. 尝试做你的互联网连接,无论是可达性状态; 然后根据成功/失败结果设置您的UI提示
  2. 如果由于networking问题而失败,则注册为可达性,并在可达性显示绿灯时重试; 当您想要从失败状态自动恢复时,这是需要的
  3. 在任何情况下,给予用户“强制重试”的可能性,无论是可达性状态。 如果成功,请立即重置您的UI提示。

苹果公司的工程师所说的是完全正确的:在互联网连接完好的情况下,经常可以在控制台日志中看到可达性故障消息。

其他的事情:没有比状态栏中显示的更好的“networking提示”:如果你有Wi-Fi图标,3G / 4G图标,蜂窝电话的强度。

回到你原来的问题:没有绝对的更好的方法来pipe理这个东西,这很大程度上取决于应用程序体系结构。 如果你更喜欢集中你的networking东西在一个专门的类(而不是一个UIViewController,但NSObject的子类),那么它可能是有道理的定义一个只读的属性,该类是更新与“成功/失败”后最新的互联网连接与服务器的应用程序(它是没有意义的ping其他服务器,如谷歌或苹果:首先它不是优雅的,第二个问题可能来自服务器的服务器,而不是设备的互联网连接状态!)。

 @property (readonly) BOOL lastConnectionToMyServerSuccess 

然后你的视图控制器可以注册(通过KVO或通过中央通知)该属性的变化,并通过显示图标或其他(我再说一遍:让用户尝试手动尝试连接到互联网)相应地更新其用户界面。 视图控制器应在不可见(“viewWillDisappear:”)或卸载(“viewDidLoad:”)或解除分配时从KVO注销。

当然这增加了一些额外的复杂性。 例如:你使用的应用程序,互联网灯是绿色的。 然后你暂停它,做别的事情,几分钟后你回到应用程序。 在这种情况下,应用程序应该ping您的服务器以恢复networking灯状态,因为在几分钟后networking状况可能已经改变(例如,你在火车上)。 在任何情况下,所有加载的视图控制器将从networking专用类获得KVO通知并自行更新。