Session是会话的意思.当我们需要跟服务器进行交互,我们可以只需要创建一个全局的单例会话
NSURLSession创建的会话,中的下载/上传/等任务默认都是挂起的,需要手动进行resume开启
所有的任务都是由单例session来管理的
1.创建单例Session
NSURLSession *session = [NSURLSession sharedSession];
2.NSURLSessionDataTask 是专门创建任务会话的 并且所有的任务都是由会话发起的
NSURLSessionDataTask *task
= [session dataTaskWithURL:url completionHandler:^(NSData *data , NSURLResponse , NSError *error){
// 在这进行反序列化
}];
3.启动会话
[task resume];
总之熟练使用可以将URL作为参数传递,抽出一个方法来使用
相比NSURLConnection 尽量多使用NSURLSession ,因为 NSURLSession在异步上面的处理比NSURLConnection要好
使用NSURLSession进行下载使用的方法是
[session downloadTaskWithURL: completionHandler:^(){
//// 这里边对下载的文件进行处理
}]
并且下载的文件是保存在沙盒的tmp文件夹中,如果在回调中不做处理是会被自动删除的
因为在下载时,一般zip文件是比较多的,可以替用户节约流量
zip包需要进行解压,解压完成之后,原始的zip包就不需要了.
下载进度跟进
在NSURLSession中提供了3个代理方法:
1.下载完成方法
- (void)NSURLSession: downloadTask: didFinishedDownloadingToURL:
2.下载进度
- (void)NSURLSession: downloadTask: didWriteData: totalBytesWritten: totalBytesExceptedToWrite:{
float progress = (float) totalBytesWritten / totalBytesExceptedToWrite;
//progress 就是下载进度
}
3.下载续传数据
- (void)NSURLSession: downloadTask: didResumeAtOffset: exceptedTotalBytes:
注意:如果需要做iOS7的适配的话这3个方法是必须都写的,但是不做iOS7适配的话,只需要写下载的方法就可以
NSURLSession的断点续传
主要是暂停和续传
暂停任务:
这里跳进NSURLSessionDownloadTask中可以看见方法
- (void)cancelByProducingResumeData: (NSData *resumeData)
这里续传需要跟进下载进度,所以不能使用块代码回调的方式 所以需要一个全局的下载属性downloadTask 用它来进行下载,并且需要注意:开始任务resume
需要注意的地方:
如果暂停方法已经执行,就是任务已经被暂停的话,不应该能够被再次暂停
方法有几种,看自己喜好:
1.可以将下载任务至为 nil
2.也可以申请一个isSuspend属性来判断是否点击了暂停(个人想法,未验证)
继续任务:
这里需要用到的是下载类中的方法
downloadTaskWithResumeData:(NSData *)
这里需要用到的是二进制数据,所以需要拿到暂停任务的地方的数据resumeData,继续申请全局的属性resumeData来进行任务的继续
注意:
1.使用"续传数据"启动下载任务的话,使用的是之前保存的续传数据(这个问题是如果连续点击继续按钮的话,下载任务一直会从暂停任务那里保存的下载进度开始的,所以多次点击,就会出问题)
所以续传数据的作用就是建立新的下载任务,所以在建立续传任务之后,需要将resumeData至为nil
!!!而且千万不要忘记,所有任务默认都是挂起的,需要resume