//联系人:石虎QQ: 1224614774昵称:嗡嘛呢叭咪哄
01.NSURLConnection下载
================================================================================
1>NSURLResponse属性
URL客户端请求的URL
MIMEType告诉客户端返回的二进制数据可以用什么软件打开
expectedContentLength二进制数据(下载文件)的长度
textEncodingName文本编码名称,UTF8/GB2312
suggestedFilename建议的文件名
*** NSURLConnection做简单的网络连接非常简单,但是复杂的网络操作,非常麻烦
2>使用异步方法下载文件
问题:
1.没有进度
2.会有瞬间的内存峰值
3>使用代理方法下载文件
#pragma mark - NSURLConnectionDataDelegate方法
// 1.接收到服务器响应,下载前的准备工作
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
}
// 2.接收到服务器数据,可能会多次
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
}
// 3.数据接收完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
}
// 4.出现错误,提示网络操作千万不要忘记出错处理
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
}
问题:
1.在iPhone5上会出现峰值
2.不过可以跟进进度
4>每次接收到数据逐一写入文件——可以解决内存峰值的问题
问题:
1.多线程
[conn setDelegateQueue:[[NSOperationQueue alloc] init]];
2.UI更新
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
02.NSURLSession介绍
================================================================================
是iOS7新推出的网络解决方案,解决了NSURLConnection中的很多问题。
NSURLSession的使用相对有些复杂,对于简单网络的网络请求,仍然可以使用NSURLConnection。
三个任务
1>NSURLSessionDataTask传统的GET / POST方法,包括POST上传文件
2>NSURLSessionDownloadTask下载任务
3>NSURLSessionUploadTask上传任务- PUT方式的文件上传
03.NSURLSession下载演练
================================================================================
1>通过块代码回调实现下载
NSURLSession *session = [NSURLSession sharedSession];
[[session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
NSLog(@"%@ %@", location.path, [NSThread currentThread]);
}] resume];
特点:
1.没有内存峰值
2.文件直接保存在临时目录,如果不做进一步处理,会直接删除
3.完成块代码同样运行在后台线程
2>下载进度跟进
- (void)viewWillDisappear:(BOOL)animated {
//自定义Session会对self进行强引用,在视图消失之前应该取消session的所有任务,否则会造成内存泄漏
[self.session invalidateAndCancel];
}
3>断点续传
- (void)downloadURL:(NSURL *)url {
self.downloadTask = [self.session downloadTaskWithURL:url];
[self.downloadTask resume];
}
- (void)pause {
[self.downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
self.resumeData = resumeData;
self.downloadTask =nil;
}];
}
- (void)resume {
if(self.resumeData ==nil) {
return;
}
self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
self.resumeData =nil;
[self.downloadTask resume];
}