URLSession解决断点续传问题。

在工程中,下载大的文件时时常用到断点续传。

利用NSURLSession进行断点续传的步骤如下:(事先说明,真正的断点续传应该是即使程序退出后,再次启动还能接着原来的进度进行下载。)

步骤一:进行界面布局,创建有关的按钮。


步骤二:让当前控制器遵守NSURLSessionDownloadDelegate协议,并实现里面的三个回调方法。

步骤三:建立全局变量。

3.1 建立一个下载任务NSURLSessionDownloadTask的全局属性,如下所示:

@property(nonatomic,strong) NSURLSessionDownloadTask *downloadTask;

3.2 建立一个全局管理的对话(NSURLSession)属性。如下所示:

@property(nonatomic,strong)NSURLSession *session;

3.3 建立一个全局的数据(NSData)属性。如下所示:

@property(nonatomic,strong)NSData *resumeData;

步骤四:重写对话属性的getter纷纷,为对话属性实现懒加载,具体如下:

-(NSURLSession *)session

{

if (_session ==nil) {

NSURLSessionConfiguration *config = [NSURLSessionConfigurationdefaultSessionConfiguration];

_session = [NSURLSessionsessionWithConfiguration:config delegate:selfdelegateQueue:nil];

}

return_session;

}

步骤五:实现开始下载事件。

5.1 为了避免下载网址中的中文字符,一定要先对网址进行一下转义如下所示:

NSString *urlStr = @"http://127.0.0.1/07-URLSession解压缩.mp4";

urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURLURLWithString:urlStr];

5.2 通过全局的Session对象开始一个任务。因为Session创建完成后默认挂起的所以要resume进行启动如下所示:

self.downloadTask = [self.sessiondownloadTaskWithURL:url];

[self.downloadTaskresume];

步骤六:实现暂停下载事件。如下所示:

/*注意:Session的特点是默认都是挂起状态,需要resume一下。取消resume,意思就是让任务重新挂起。也就是暂停的意思。

*/

NSLog(@"%s", __func__);

[self.downloadTaskcancelByProducingResumeData:^(NSData *resumeData) {

NSLog(@"=----------%tu", resumeData.length);

// 保存起来暂停时候的字节数

self.resumeData = resumeData;

//需要释放下载任务

self.downloadTask =nil;

}];

步骤七:实现继续下载事件。。。。。。。

。。。。。。步骤太麻烦,省去了。大致理解思路,面试可装逼即可,真正下载的时候使用AFNetWorking进行下载。

代码如下:

<span style="font-size:18px;">//
//  ViewController.m
//  NSURLSession进行下载
//
//  Created by apple on 15/10/30.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import "ViewController.h"
#import "SSZipArchive.h"
@interface ViewController ()<NSURLSessionDownloadDelegate>

/**下载任务*/
@property(nonatomic, strong) NSURLSessionDownloadTask *downloadTask;

/**全局管理的对话*/
@property(nonatomic, strong)NSURLSession *session;

/**续传的数据*/
@property(nonatomic, strong)NSData *resumeData;

@end

@implementation ViewController

-(NSURLSession *)session
{
    if (_session == nil) {
        NSURLSessionConfiguration  *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return _session;
}

/**暂停下载*/
- (IBAction)pause {
    NSLog(@"暂停");
    /*注意:Session的特点是默认都是挂起状态,需要resume一下。取消resume,意思就是让任务重新挂起。也就是暂停的意思。
     */
    NSLog(@"%s", __func__);
    [self.downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
        NSLog(@"=----------%tu", resumeData.length);
        
        // 保存起来暂停时候的字节数
        self.resumeData = resumeData;
        
        // 需要释放下载任务
        self.downloadTask = nil;
    }];
}

/*继续下载*/
- (IBAction)continueDownload {
    NSLog(@"继续");
    NSLog(@"%@", NSHomeDirectory());
    if (self.resumeData == nil) {
        NSLog(@"没有续传的数据");
        return;
    }
    
    // 使用上一次的记录,新建一个下载任务
    self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
    
    // 一旦任务建立完成,之前的续传数据也就没有意义了,需要释放掉
    self.resumeData = nil;
    
    [self.downloadTask resume];
}

/*开始下载任务*/
-(IBAction)begin
{
    // 1 url
    NSString *urlStr = @"http://127.0.0.1/07-URLSession解压缩.mp4";
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:urlStr];
    
    // 通过Session对象开始一个任务
    self.downloadTask = [self.session downloadTaskWithURL:url];
    
    // 继续
    [self.downloadTask resume];
}

#pragma mark- NSURLSessionDownloadDelegate

// 1、 下载完成后被调用的方法 IOS7&IOS8都必须实现的方法
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
    NSLog(@"下载完成");
    
    self.downloadTask = nil;
    
    // 新建文件保存路径
    NSString *targetPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"1234.mp4"];
    [[NSFileManager defaultManager] copyItemAtPath:location.path toPath:targetPath error:nil];
    NSLog(@"targetPath= %@", targetPath);
    NSLog(@" location.path= %@", location.path);
}

// 2、 下载进度变化的时候被调用的。 IOS8可以不实现,但IOS7必须实现
/**
 bytesWritten: 本次写入的字节数
 totalBytesWritten:已经写入的字节数(目前下载的字节数)
 totalBytesExpectedToWrite:总得下载字节数(文件的总大小)
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    float progress =(float) totalBytesWritten/totalBytesExpectedToWrite;
        NSLog(@"%f", progress);
//    NSLog(@"======%@", [NSThread currentThread]);
}

// 3、断点续传的时候,被调用的方法。一般什么都不写,IOS8可以不实现,但IOS7必须实现
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{
    
}
@end</span>

执行结果如下:





打开下载文件的保存路径:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值