NSURLSession 简单入门及断点下载续传实例

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值