NSURLSession

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

你可能感兴趣的:(NSURLSession)