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
原创粉丝点击