有关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);
 }

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

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

IOS 开发 NSURLConnection使用大全(包括请求,上传,下载)详解

网络开发方案在iOS中,常见的发送HTTP请求的方案包括: 苹果官方第三方框架 NSURLConnection 在IOS9之后,已经被苹果废弃,取而代之的是iOS7之后出现的NSURLSession1...
  • kuangdacaikuang
  • kuangdacaikuang
  • 2016年11月29日 11:15
  • 949

NSURLSession 和 NSURLConnection的区别

NSURLSession 和 NSURLConnection的区别
  • Setoge
  • Setoge
  • 2016年08月08日 10:59
  • 1119

iOS网络开发编程之NSURLConnection详解

iOS网络层常用的库如ASIHTTPRequest,AFNetworking,MKNetworkKit等知名的第三方库。随着ASI不再更新,楼主基本上也跟着大部队用了AF。AF用的是Cocoa层的AP...
  • GrowingGiant
  • GrowingGiant
  • 2015年03月03日 21:07
  • 2253

回复几个问题

上周末跟老朋友聚会,谈到技术的时候,有一个共识,软件开发方面真正有价值的进步,应当是有利于用户、有利于项目管理、有利于解决领域问题,而不是有利于程序员。多年以来,主流语言和系统的很多改进,其目的都是为...
  • myan
  • myan
  • 2010年09月14日 22:41
  • 36246

有关DLL的几个问题

一、DLL被多个进程调用问题 Win32系统会确保内存中只有一个该DLL的拷贝,这是通过内存映射文件来实现的。不同的进程分别将这份DLL的代码段地址映射到自己的进程空间中,同时不同的进程在自己的进程...
  • immigrator
  • immigrator
  • 2012年11月30日 23:42
  • 1083

iOS NSURLConnection GET和POST

iOS自带的网络请求的类主要为NSURLConnection,后来添加了NSURLConnectionSession。 在NSURLConnection中常用的四个类 NSURLNSURL...
  • a316212802
  • a316212802
  • 2015年11月30日 20:50
  • 1650

NSURLConnection设置代理

1 NSURLConnection设置代理(1)两种为NSURLConnection设置代理方式的区别 //第一种设置方式: //通过该方法设置代理,会自动的发送请求 // [[...
  • azhang_coder
  • azhang_coder
  • 2016年11月18日 21:32
  • 638

使用NSURLConnection的网络请求与封装

访问网络的方式: 1、同步请求: 会阻塞主线程 2、异步请求: 无法取消 请求过程在多线程执行   基本流程: 1、构造NSURL实例。 2、生成NSURLRequest请求。 3、通过...
  • itpeng523
  • itpeng523
  • 2014年07月08日 23:06
  • 5052

有关c#的几个问题

1.在面向对象中既然结构体中可以有成员变量也可以有方法等,那为什么还要有类的存在呢? :结构体是值类型,而类是引用类型。然后就是值类型和引用类型之间的区别了。 2.String 和string有何...
  • tq123_123tq
  • tq123_123tq
  • 2016年03月05日 22:48
  • 195

有关二进制的几个问题

1.编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?】 输入例子 : 1999 2299 输出例子 : 7 int main() { int a = 0; ...
  • MBuger
  • MBuger
  • 2016年07月20日 10:57
  • 273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关NSURLConnection的几个问题
举报原因:
原因补充:

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