有关NSURLConnection的几个问题

原创 2016年08月31日 14:45:45

想检测一下NSURLConnection的几种网络请求的使用方法的区别,做了以下几步:
1.从百度扒了一张图片地址,作为下载源;
2.做如下编写:

appendData = [NSMutableData new];
NSString *imageUrl = @"http://img5.duitang.com/uploads/item/201410/08/20141008205721_JUaJS.jpeg";
NSURL *url = [NSURL URLWithString:[imageUrl   stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];

NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];

NSURLResponse *response = nil;
NSError *error = nil;
NSOperationQueue *queue = [[NSOperationQueue alloc]init];

一、同步请求

NSData *data = [NSURLConnection sendSynchronousRequest:requestreturningResponse:&responseerror:&error];
if (error ==nil) {
    NSLog(@"data:%@",data);
    NSLog(@"current_synchThread:%@",   [NSThread currentThread]);
    UIImage *image = [UIImage imageWithData:data ];
    imageView.image = image;
}
NSLog(@"current_synchThread_after:%@",[NSThread currentThread]);

注一:通过同步请求方式发现,同步请求等待数据完全返回之后才往下执行。

二、异步请求方式一

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * __nullable response,NSData * __nullable data,NSError *__nullable error){
     if (error) {
        NSLog(@"error=%@,",error.localizedDescription);
    }else{

        NSLog(@"data_length:%d",[data length]);
        NSLog(@"current_synchThread:%@",[NSThread currentThread]);

        dispatch_sync(dispatch_get_main_queue(), ^{

            UIImage *image = [UIImage imageWithData:data ];
            imageView.image = image;
        });

        NSLog(@"data:%@",data);
    }
}];

NSLog(@"current_synchThread_after:%@",[NSThread currentThread]);

注二:通过打印发现,current_synchThread 并不是主线程,说明此方法进行时会重新开辟线程;此外current_synchThread_after会在返回data数据之前执行,进一步证明了这是个异步请求方式。

三、 异步请求方式二

_connect = [[NSURLConnection alloc]initWithRequest:request delegate:self];
[_connect start];

/* 异步方式二的代理方法/

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    [appendData setLength:0];

    NSLog(@"response:%@",response.description);
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSDictionary *allHeaderFilders = [httpResponse allHeaderFields];
    NSLog(@"allHeader:%@",allHeaderFilders);

    long long totalLength = [[allHeaderFilders objectForKey:@"Content-Length"]longLongValue];
    NSLog(@"totalLength:%lld",totalLength);

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

    NSThread *thread = [NSThread currentThread];
    NSLog(@"currentThread:%@",thread);

    [appendData appendData:data];
    NSLog(@"data_length:%d",[appendDatalength]);
    UIImage *image = [UIImage imageWithData:appendData];
    imageView1.image = image;
    if ([appendData length]) {
         [_connectcancel];
    }
    NSLog(@"data:%@",appendData);
 }

注三:这里在返回数据的时候是分批返回的,当返回第一批数据时,我用了[_connect cancel]去停止链接,这时候加载图片发现图片只加载了上半部分,对照数据data也发现是完全加载的数据的前半部分。

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"finish");
 }

 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

    NSLog(@"error:%@",error.localizedDescription);
 }

相关运行结果如下图:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

VB调试过程中的几个问题

  • 2012年05月19日 14:40
  • 28KB
  • 下载

Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案

前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下。有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹...

Logstash启动遇到的几个问题

1.Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME.设置环境变...

关于计算机普及教育的几个问题

  • 2011年05月12日 18:42
  • 42KB
  • 下载

排队论中几个问题的探讨

  • 2011年12月13日 20:29
  • 553KB
  • 下载

【SpringFox / Swagger文档生成工具】使用过程中的几个问题积累

转载本文请标明出处,谢谢!SpringFox是最新版的Swagger文档生成工具,SpringFox官方文档参见:SpringFox官方参考文档SpringFox与Spring Boot的集成 添加配...

初学时常见的几个问题

  • 2011年12月29日 18:07
  • 191KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关NSURLConnection的几个问题
举报原因:
原因补充:

(最多只允许输入30个字)