与以下代码相比,使用可达性有什么优势?我觉得可到达性具有大量的代码,但是如果在任何方面都比较好,那我将使用它。

NSString *connectionString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

if ([connectionString length] == 0) {

    //No connection

}

现在可以肯定的是,如果Google曾经倒闭,那将行不通。但是,实际上没有任何可能性。你怎么看?谢谢!

最佳答案

这实际上是一个很好的问题-太好了,以至于我在公司招聘时实际上在iOS开发人员面试中使用了它:



首先,网络可达性实际上是非常非常复杂的。它不只是简单地测试URL。考虑以下示例:

  • 该用户正在使用3G,但已用尽了其数据配额,因此每个
    请求重定向到运营商的网站。
  • 用户已连接到需要
    身份验证/登录,因此请求重定向到登录页面

  • 最后一个例子非常常见-它一直在发生。但是,如果您使用initWithContentsOfURL,则您的应用程序会想象您具有连接性,而实际上却没有:您将只是返回了网络已将您重定向到的页面内容。

    这就是为什么Apple的代码比您最初认为的要复杂的原因之一。您不应该只是问“我能到达这个URL”,而是“从这个URL返回的数据是我期望的是什么”。

    但这实际上只是冰山一角。可达性除此之外还有很多其他功能-例如,我可能有一个需要下载大量信息的应用程序,比如说值(value)50MB。如果用户未经他们的同意而使用3G连接,则仅下载50MB的数据是个坏主意-尤其是在漫游或受限数据计划的情况下。因此,可达性还会告诉您用户所用的连接类型:EDGE,3G,WiFi等(* NB:请参阅下面的注释,这可能不是最佳建议)。

    可达性中的ReadMe.txt会告诉您有关代码可以做什么和不能做什么的更多信息。

    不幸的是,网上有太多人没有意识到,在很多日常情况下,initWithContentsOfURL将返回有效响应,但用户将无法连接。 [这样的博客文章] [1]在Google中被索引,人们认为它是可以接受的替代品:事实并非如此!

    我在招聘时问这个问题的原因之一是,它可以表明开发人员不只是在盒子里思考-与您和许多其他开发人员一样,当我看到“可达性”示例代码时,我的第一反应是“哇,这看起来太复杂了对于一些非常简单的事情”。但是希望这个答案能在某种程度上说服您。

    编辑:绝对要注意下面史蒂文的评论。他提出了我的答案尚未考虑的一些要点(即MiFi热点),并提出了一个有效的案例,即可达性并不一定就是编码的最高峰。在许多情况下,开发人员会通过自己的改进等来修改可达性。

    07-24 21:55