NSURLSession 简单入门及断点下载续传实例
来源:互联网 发布:历史大事年表知乎 编辑:程序博客网 时间:2024/06/02 05:10
iOS7引入了NSURLSession类,灵活运用网络请求也就更加方便,这几天到处从网站上学习别人的经验,自己也尝试着写写,权且当做练手,其中还有一些不明白的,日后还需自己多看多学.
直接上代码吧,都写在里面了
找到这张图,感觉还是能具体的阐述NSURLSession 以及他的子类之间的关系
//// ViewController.m// NSURLSessionConfiguration (配置)//// Created by Aotu on 16/3/9.// Copyright © 2016年 Aotu. All rights reserved.//#import "ViewController.h"@interface ViewController ()<NSURLSessionDataDelegate,NSURLSessionDelegate,NSURLSessionDownloadDelegate>{ NSURLSessionDownloadTask *_downLoadTask; NSURLSessionConfiguration *_sessionConfiguration; NSURLRequest *_request; NSURLSession *_session; NSData *_partial; //部分下载好的data}@property (weak, nonatomic) IBOutlet UIImageView *showImageView;@property (weak, nonatomic) IBOutlet UIImageView *showImageVIew2;@property (weak, nonatomic) IBOutlet UIImageView *showBigImageVIew;@property (weak, nonatomic) IBOutlet UIProgressView *progressVIew;@property (weak, nonatomic) IBOutlet UIButton *dowmloadBtn;@property (weak, nonatomic) IBOutlet UIButton *pause;@property (weak, nonatomic) IBOutlet UIButton *resume;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; /* NSURLSesssion提供的功能 1.通过url 可以将数据下载到内存 2.通过url,将数据下载到文件系统 3.将数据上传到指定url 4.灵活且强大的后台处理能力 */ /* 用法 使用NSURLSession的一般套路如下: 1. 定义一个NSURLRequest 2. 定义一个NSURLSessionConfiguration,配置各种网络参数 3. 使用NSURLSession的工厂方法获取一个所需类型的NSURLSession 4. 使用定义好的NSURLRequest和NSURLSession构建一个NSURLSessionTask 5. 使用Delegate或者CompletionHandler处理任务执行过程的所有事件。 */ NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://photo.l99.com/bigger/20/1369291999760_0czr7j.jpg"]]; //(一) NSURLSessionConfiguration 配置参数// 三种模式可供创建// 默认session || 瞬时session || 后台Session //1 NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; //1.1 sessionConfiguration.allowsCellularAccess = YES ; //指定是否允许使用蜂窝网络 //1.2 //如果 sessionConfiguration模式为 后台模式 backgroundSessionConfigurationWithIdentifier 则⬇️ sessionConfiguration.discretionary = YES; //标示当程序后台运行时候,由系统自己选择最合适的网络链接配置 //(二)NSURLSession //首先,得获取一个session //2.获取NSURLSession的几种方法 //2.1 静态的sharedSession ,官方文档说其使用共享的方法获取session,这种方式获取的session拥有全局的Cache,Cookie,证书, NSURLSession *session1 = [NSURLSession sharedSession]; //2.2一般创建方法 与NSURLSessionConfiguration 组合使用 NSURLSession *session2 = [NSURLSession sessionWithConfiguration:sessionConfiguration]; //2.3 带delegate & delegateQueue NSURLSession *session3 = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; [session3 invalidateAndCancel]; //当不需要连接时 调用此方法取消 //(三) 构建Task处理 //3 NSURLSessionTask (网络请求处理类) 包含三个子类 NSURLSessionDataTask(可以说上传内容,且上传后可下载) || NSURLSessionUploadTask(上传用的task,不能再下载) NSURLSessionDownloadTask(仅下载用的task) //3.1 NSURLSessionDataTask 创建方法 //基于reques 创建 NSURLSessionDataTask *dataTaskREQ = [session1 dataTaskWithRequest:request]; //基于Url 创建 NSURLSessionDataTask *dataTaskURL = [session2 dataTaskWithURL:[NSURL URLWithString:@"http://photo.l99.com/bigger/20/1369291999760_0czr7j.jpg"]]; //基于request 创建 带Block返回 data数据 response error等信息 NSURLSessionDataTask *dataTaskREQWith = [session2 dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"data === %@",data); dispatch_async(dispatch_get_main_queue(), ^{ _showImageView.image = [UIImage imageWithData:data]; }); }]; //基于Url创建 带Block返回 Data数据 response error等信息 NSURLSessionDataTask *dataTaskURLWith = [session2 dataTaskWithURL:[NSURL URLWithString:@"http://tupian.enterdesk.com/2013/lxy/12/30/2/5.jpg"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"data === %@",data); dispatch_async(dispatch_get_main_queue(), ^{ _showImageVIew2.image = [UIImage imageWithData:data]; }); }]; //3.2 NSURLSessionUploadTask NSURLSessionUploadTask *uploadTask1 = [session2 uploadTaskWithRequest:request fromData:nil]; NSURLSessionUploadTask *uploadTask2 = [session2 uploadTaskWithRequest:request fromData:nil completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"error111 === %@",error); }]; NSURLSessionUploadTask *uploadTask3 = [session2 uploadTaskWithRequest:request fromFile:nil]; NSURLSessionUploadTask *uploadTask4 = [session2 uploadTaskWithRequest:request fromFile:nil completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //由于没有后台服务器支持 故上传实现不了 这里写上方法 }]; NSURLSessionUploadTask *uploadTask5 = [session2 uploadTaskWithStreamedRequest:request]; //3.3NSURLSessionDownloadTask NSURLSessionDownloadTask *downLoadTask1 = [session2 downloadTaskWithRequest:request]; NSURLSessionDownloadTask *downLoadTask2 = [session2 downloadTaskWithURL:[NSURL URLWithString:@"http://tupian.enterdesk.com/2013/lxy/12/30/2/5.jpg"]];// NSURLSessionDownloadTask *downLoadTask3 = [session2 downloadTaskWithResumeData:nil]; //断点下载 //同样 下载也有 completionHandler 包含的回调信息 这里就不写了 //4 调用resume 开始执行 [dataTaskREQ resume]; [dataTaskURL resume]; [dataTaskREQWith resume]; [dataTaskURLWith resume]; [uploadTask1 resume]; [uploadTask2 resume]; [downLoadTask1 resume]; [downLoadTask2 resume];// [downLoadTask3 resume]; // 好了 那么下面 做一个断点续传的例子 检验下 [self crateSession];}//配置网络-(void)crateSession{ _progressVIew.progress = 0; NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://tupian.enterdesk.com/2013/lxy/12/30/2/5.jpg"]]; _sessionConfiguration = sessionConfiguration; _session = session; _request = request;}//点击下载- (IBAction)download:(id)sender { _downLoadTask = [_session downloadTaskWithRequest:_request]; [_downLoadTask resume]; _dowmloadBtn.enabled = NO;}//点击暂停- (IBAction)pause:(id)sender { if (_downLoadTask) { [_downLoadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) { _partial = resumeData; _downLoadTask = nil; }]; }}//点击继续- (IBAction)resume:(id)sender { if (!_downLoadTask) { //判断是否有下载过的数据,有就断点续传 没有就下载 if (_partial) { _downLoadTask = [_session downloadTaskWithResumeData:_partial]; // 从已有的数据上继续下载 }else{ _downLoadTask = [_session downloadTaskWithRequest:_request]; //重新下载 } } [_downLoadTask resume];}//download Delegate-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ NSLog(@"下载完成后,文件的tem目录地址信息 %@",location); NSURL *destitnaion = [self createDirectoryWithlocationForDownloadTempByUrl:location]; BOOL success = [self copyTempFileFormURL:location toDestination:destitnaion]; if (success) { //文件保存成功 //下载完成 显示图片 dispatch_async(dispatch_get_main_queue(), ^{ _showBigImageVIew.image = [UIImage imageWithContentsOfFile:[destitnaion path]]; NSLog(@"下载完成后,文件的document目录地址信息 %@",destitnaion); }); }else if (!success){ NSLog(@"hahahahahha"); } _downLoadTask = nil;}//刷新进度条方法-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{ //刷新进度条 double currentProgress = totalBytesWritten / (double)totalBytesExpectedToWrite; dispatch_async(dispatch_get_main_queue(), ^{ _progressVIew.progress = currentProgress;// _progressVIew.hidden = NO; if (currentProgress == 1) { _dowmloadBtn.enabled = YES; } });}//创建文件的documents的(路径)保存目录-(NSURL*)createDirectoryWithlocationForDownloadTempByUrl:(NSURL*)location{ NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; NSLog(@"urls ******** %@",urls); NSURL *documentsDirectory = urls[0]; NSLog(@"urls[0] ******** %@",documentsDirectory); NSLog(@" [location lastPathComponent] ******** %@",[location lastPathComponent]); return [documentsDirectory URLByAppendingPathComponent:[location lastPathComponent]];}//从tem复制到Documents文件夹-(BOOL)copyTempFileFormURL:(NSURL*)location toDestination:(NSURL*)destination{ NSError *error; NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager removeItemAtURL:destination error:NULL]; [fileManager copyItemAtURL:location toURL:destination error:&error]; if (error == nil) { return true; }else{ NSLog(@"%@",error); return false; }}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end
具体代码在这里
:https://github.com/tianNanYiHao/NSURLSessionConfiguration-.git
0 0
- NSURLSession 简单入门及断点下载续传实例
- NSURLSession实现断点下载
- 【iOS】NSURLSession断点下载
- NSURLSession实现断点下载
- NSURLSession 断点下载
- iOS开发-使用NSURLSession实现文件断点下载,文件离线续传以及图片上传
- NSURLSession NSURLConnection下载大文件 断点下载
- 使用AFNetworking 2.0 断点下载 NSURLSession
- quartz入门(一)下载及简单实例
- NSURLSession的下载和断点继传以及后台下载功能
- 简单实现断点下载
- iOS中利用NSURLSession进行文件断点下载
- iOS中利用NSURLSession进行文件断点下载
- iOS中利用NSURLSession进行文件断点下载
- NSURLSession下载图片的简单例子
- mybatis入门配置详解及实例下载
- NSURLSession实现续点下载
- Android入门:多线程断点下载
- Struts2框架的标签库
- 关于SpringMvc中的事务@Transactional
- 【混合编程】C#调用C++
- bzoj2134 单选错位 递推
- 清华1084,整数拆分
- NSURLSession 简单入门及断点下载续传实例
- 原始的爱情
- 层次聚类算法及其实现
- 主流WiFi芯片与性能简介
- Word自动编号多级标题设置
- 枚举
- 在DLL编程中,导出函数为什么需要extern "C"
- 如何构建研发质量管理体系?
- 【HDU-2639】Bone Collector II(背包)