美文网首页
NSURLSession

NSURLSession

作者: 闲得一B | 来源:发表于2016-04-19 00:52 被阅读304次
使用步骤:
    NSURLSession对象创建Task,然后执行Task

Task:
    NSURLSessionTask:抽象类。
    NSURLSessionDataTask:都能
    NSURLSessionUploadTask:上传
    NSURLSessionDownloadTask:下载  大文件
    需要手动resume恢复任务。

下载文件:
    根据NSURLSession获取到单例,单例根据URL获取到NSURLSessionDownloadTask实例任务,启动任务resume。
    在这个实例的block回调中根据下载的文件位置,使用NSFileManager将文件剪切到对应的文件夹。

代理的方式:
    能监听下载进度。
    1、需要在创建NSURLSession时设置代理。
    2、遵守NSURLSessionDataDelegate协议。
    3、当接收到服务器响应时,需要调用block的completionHandler(NSURLSessionResponseAllow);(设置允许处理服务器的响应,才会继续接收服务器返回的数据)
    4、然后执行接收到服务器的数据方法
    5、最后调用执行完毕的方法(不管执行成功或者失败)

大文件下载:
   1、NSURLSessionDownloadTask+NSURLSession的代理方式(注意下载文件位置,想下载对应的位置需要将文件剪切)
   2、NSURLSessionDataTask+NSURLSession的代理方式(文件路径可以自己直接设置)
    代理的方式能监听下载进度,不会将数据写入缓存,所以适合大文件,而block的方式将数据写入缓存,不适合大文件下载

文件暂停和恢复:
    resume方法和suspend方法能直接恢复和暂停。
    缺点:程序退出后再开启程序不能接着下载
    解决:
    1、通过NSURLSessionDownloadTask任务的cancelByProducingResumeData:^(NSData *resumeData){}取消任务。将resumeData写入沙盒中。
    2、将文件的位置保存到plist文件中。(解决多个文件)
    3、下次打开时看沙盒中有没有plist文件,有就读取这个文件,通过dowloadTaskWithResumeData:这个方法飞将resumeData传给服务器。
    (resumeData记录着上次和服务器的交互信息,直接将这个传给服务器,服务器就知道从哪里开始下载。)
    注意:
    cancelByProducingResumeData:取消任务是不能恢复的,只能重新创建任务。

断点下载原理:
    通过设置请求头的Range的方式就能实现。
    resumeData已经包含了,也就是NSURLSession已经实现了。        
    而NSURLConnection需要手动设置:[[NSMutableURLRequest requestWithURL:nil]setValue:@"0-"   forHTTPHeaderField:@"Range"]

如果下载中途失败:
    能在失败的error中获取到resumeData。error.userInfo[NSURLSessionDownloadTaskResumeData]。

程序下载中途用户退出或程序崩溃
    方法一:可以在- (void)applicationWillTerminate:(UIApplication *)application{}
           方法中将调用cancelByProducingResumeData:方法(不靠谱)
    方法二:启动程序后获取到已经下载的文件的大小,再发送网络请求时,使用NSURLSeesion的dataTaskWithRequest:来设置请求体。
    注意:
    不用downloadTask的原因:下载的数据是下载在tmp中,会随时删除。
    沙盒目录:
    Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
    tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
    Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

防止重复下载
    当下载的长度等于服务器响应的长度时说明下载过了。

获取下载过的文件的长度
[[[NSFileManager defaultManager] attributesOfItemAtPath:XMGFileFullpath error:nil][NSFileSize] integerValue]

文件的名字的保存方式
    根据文件名的MD5和文件的总长度生成一个字典。

下载过了
    当下载的长度等于保存在字典中的长度时说明下载完毕了。
    注意:下载0和保存0的情况。

下载进度
    用已经下载的除以总长度,建议封装成单例,供多个界面共享进度。

文件上传:
    uploadTaskWithRequest:fromFile:方法
    直接能将文件上传到服务器,但是这样不安全,这里使用的是PUT请求(需要服务器支持)。
    所以如果想要使用pust请求还是需要拼接请求体。

设置请求超时:
    timeoutIntervalForRequest能统一设置所有请求的超时时间。

设置蜂窝网络
    allowsCellularAccess

https
    通过代理NSURLSessionTaskDelegate来处理证书。
    但是通过AFN内部已经处理好了。

获得共享的Session
    +(NSURLSession*)sharedSession;

自定义Session
    +(NSURLSession*)sessionWithConfiguration: (NSURLSessionConfiguration*)configuration delegate:(id<NSURLSessionDelegate>)delegatedelegateQueue:(NSOperationQueue*)queue;

常用方法
    -(void)suspend;// 暂停
    -(void)resume;// 恢复
    -(void)cancel;// 取消
    @property(readonly,copy)NSError*error; //错误
    @property(readonly,copy)NSURLResponse*response; //响应
    -(void)cancelByProducingResumeData:(void(^)(NSData*resumeData))completionHandler;// 取消任务

相关文章

网友评论

      本文标题:NSURLSession

      本文链接:https://www.haomeiwen.com/subject/hybalttx.html