//联系人:石虎 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. 在 iPhone 5上会出现峰值
2. 不过可以跟进进度
4> 每次接收到数据逐一写入文件 —— 可以解决内存峰值的问题
问题:
1. 多线程
[conn setDelegateQueue:[[NSOperationQueue alloc] init]];
2. UI更新
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
02. NSURLSession介绍
================================================================================
是 iOS 7 新推出的网络解决方案,解决了 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];
}