IOS网络--NSURLConnection

¥状态栏中旋转加载图标的显示

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

cancel 停止下载

1、将url再次包装成一个一个NSURLRequest对象,可被NSURLConnection使用

  1、NSURLRequest * request = [NSURLRequest requestWithURL:url];

  2、 NSURLRequestReloadIgnoringLocalCacheData 忽略本地缓存

    timeoutInterval 等待请求的最大时间

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];

3、请求指定大小的文件、获取当前下载了的大小,封装成range

    NSString * rangeStr = [NSString stringWithFormat:@"bytes=%lld-",[self.downloadSize longLongValue]];

    

    设置请求数据范围、(NSMutableURLRequest中的方法forHTTPHeaderField)

    [request setValue:rangeStr forHTTPHeaderField:@"Range"];

1、根据request建立网络链接NSURLConnection

分为三种方式:

(1)同步请求

同步请求一般不用,因为会卡UI,但是某些特定情况,有可能用到,银行保证安全,游戏更新

1》NSURLConnection建立网络连接(同步的)

NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

2》请求后要判断是否请求成功

if (error) {

        NSLog(@"%@",error);

        return;

    }

(2)异步请求(block)

block形式的异步请求

1.操作简单,返回的是整体数据

  2.不能分步接收,就不能显示进度

1》发送异步请求

参数一:队列、获取主队列

返回值:  1. NSURLResponse *response

    2. NSData *data

  3. NSError *connectionError

[NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {--blcok回调,下载完成--}

2》判断下载成功否?(两种方式)

1.根据状态码判断

NSHTTPURLResponse * httpReponse = (NSHTTPURLResponse *)response;

if (httpReponse.statusCode != 200) {

            NSLog(@"下载出错");

        }

2.返回数据data存在 && 错误为空

if (data && !connectionError) {

            self.imageView.image = [UIImage imageWithData:data];

        }else{

            NSLog(@"下载出错");

        }

(2)异步请求(代理)

遵守协议NSURLConnectionDataDelegate

4个代理方法

可以实时监测下载进度

1》请求之前,将自己的数据清空

     self.resultData.length = 0;

2》代理方法进行异步请求

[NSURLConnection connectionWithRequest:request delegate:self];

3》实现代理的四个方法

1.开始准备下载,链接有响应,已经下载完响应头

-(void)connection:  didReceiveResponse: 

获取数据的总长度

    self.totalSize = response.expectedContentLength;

2.正在接收数据,接收响应体,会根据数据大小,反复不间断的接收

-(void)connection:  didReceiveData: 

  不间断的接收数据、拼接到全局变量里

    [self.resultData appendData:data];

    获取进度比

    float pv = self.resultData.length/self.totalSize;

    更新进度条、用异步、(一些ui上的操作要用异步)

    dispatch_async(dispatch_get_main_queue(), ^{

        self.progressView.progress = pv;

    });

3已经下载完毕

-(void)connectionDidFinishLoading:

4.下载发生错误

1.断网了

      2.地址出错

-(void)connection:  didFailWithError: 

小结:4ge代理方法

(1)准备下载、链接与响应、已经下载完响应头didReceiveResponse

获取文件的总大小

(2)正在下载、反复调用didReceiveData

更新下载进度

(3)下载完毕connectionDidFinishLoading

释放对象、将下载到的数据赋值到需要显示的地方

(4)下载失败didFailWithError

释放对象、打印错误信息

原文地址:https://www.cnblogs.com/gaduo/p/4999078.html