既然我们有[NSData dataWithContentsOfURL:],我们为什么要使用[NSURLConnection sendSynchronousRequest:returningResponse:error:]?

时间:2014-06-24 09:14:13

标签: ios objective-c nsurlconnection

我们可以通过以下代码轻松获取简单的网页内容:

+ (NSString *)getContentWithURL:(NSString *)urlString {
    NSURL *url = [NSURL URLWithString:urlString];
    NSData *data = [NSData dataWithContentsOfURL:url];
    if(!data) {
        return @"";
    } else {
        return [NSString stringWithUTF8String:[data bytes]];
    }
}

但有人告诉我使用NSURLConnection?

4 个答案:

答案 0 :(得分:2)

两者都是不同的东西:

dataWithContentsOfURL:

  

此方法非常适合将data:// URL转换为NSData对象,也可用于同步读取短文件。如果您需要读取可能较大的文件,请使用inputStreamWithURL:打开流,然后一次读取一个文件。

     

重要说明:请勿使用此同步方法来请求基于网络的网址。对于基于网络的URL,此方法可以在慢速网络上阻止当前线程持续数十秒,从而导致用户体验不佳,而在iOS中,可能会导致应用程序被终止。

sendSynchronousRequest:returningResponse:error:

  

同步加载构建在类可用的异步加载代码之上。当异步加载系统在专门为此加载请求生成的线程上执行URL加载时,将阻止调用线程。调用线程中不需要特殊的线程或运行循环配置来执行同步加载。

     

重要事项:由于此调用可能需要几分钟才能失败(特别是在iOS中使用移动网络时),因此不应从GUI应用程序的主线程调用此函数。

答案 1 :(得分:0)

NSURLConnection方式为您提供有关响应的更多信息。如果请求失败,则NSData只会获得nil个数据,而不会提供任何其他内容。使用NSURLConnection,您还可以获得HTTP响应并向用户显示NSError

答案 2 :(得分:0)

NSURLConnection提供了运行同步/异步请求的灵活性。同样使用NSURLConnection,您可以使用请求类型get / post / put等发出请求,同时可以使用dataWithContentsOfURL方法。

答案 3 :(得分:0)

dataWithContentsOfURL是同步的,这意味着如果您在主线程上运行它,整个UI将锁定,用户将无法执行任何;看起来你的应用程序已经挂起了。

虽然可能位于快速,可靠的网络上,但请记住,许多iPhone用户处于不可靠且速度较慢的蜂窝网络上。或者他们可能有一个很好的信号,然后开车进入隧道。您不应该假设网络可用或快速。同步网络调用隐含地假设两者。