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
释放对象、打印错误信息