iOS文件下载(二)

使用NSURLSession

写在前面

NSURLSession是iOS7之后推出的网络操作工具类。主要目的是替换NSURLConnection。

NSURLSession基本使用

    //1. 获取NSURLSession对象
    NSURLSession *sesion = [NSURLSession sharedSession];
    //2. 创建URL
    NSURL *url = [NSURL URLWithString:@""];
    //3. 创建任务
    NSURLSessionDownloadTask *task = [sesion downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
        // 1. location->下载完后临时文件的位置,如果不进行任何操作,程序结束后会删除此下载的文件
        //将文件剪切到缓冲文件
        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        NSString *file = [caches stringByAppendingPathComponent:response.suggestedFilename];
        NSFileManager *manager = [NSFileManager defaultManager];
        [manager moveItemAtPath:location.path toPath:file error:nil];

        NSLog(@"下载完毕%@", response);
    }];

    //4. 开始任务
    [task resume];

NSURELSession代理方式下载

//1. 创建NSURLSessionConfiguration对象
    NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];
    //2. 创建NSURLSession对象并设置代理<NSURLSessionDownloadDelegate>
    NSURLSession *session = [NSURLSession sessionWithConfiguration:cfg  delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    //3. 创建URL
    NSURL *url = [NSURL URLWithString:@""];
    //4. 创建下载任务
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url];
/*
     //注意:如果给下载任务设置了completionHandler这个block,也实现了代理方法,优先使用代理方法
     NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
    }];
*/
    //5. 实现下代理方法

NSURLSession常用代理方法

/**
 *  完成下载
 *
 *  @param session
 *  @param downloadTask
 *  @param location    下载文件的临时路径
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{

    //建议文件名
   // downloadTask.response.suggestedFilename;
}
/**
 *  恢复下载
 *
 *  @param session
 *  @param downloadTask
 *  @param fileOffset
 *  @param expectedTotalBytes
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{

}

/**
 *  下载完一部分时就会调用
 *
 *  @param session
 *  @param downloadTask
 *  @param bytesWritten              本次调用写了多少
 *  @param totalBytesWritten         已经写了多少
 *  @param totalBytesExpectedToWrite 文件总大小
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{

    //下载进度
    //(double)totalBytesWritten / totalBytesExpectedToWrite;
}

NSURLSession断点下载

//下载任务对象
@property (nonatomic, strong)NSURLSessionDownloadTask *task;
//暂停下载后返回的数据信息,包含了下载的位置,恢复下载时将此信息传递过去就会接着下载
@property (nonatomic, strong)NSData *resumeData;
//NSURLSession对象
@property (nonatomic, strong)NSURLSession *session;
/**
 *  暂停/开始按钮响应事件
 *
 *  @param sender
 */
- (void)btnAction:(UIButton*)sender{
    if (self.task == nil) { //如果下载任务为空,开始下载或者恢复下载,否则暂停下载
        if(self.resumeData){//如果暂停后返回的信息为空,开始下载,否则恢复下载
            [self resume];
        }else{
            [self start];
        }
    }else{
        [self pause]; //zt
    }
}

- (void)resume{
    //恢复下载
    self.task = [self.sessin downloadTaskWithResumeData:self.resumeData];
    [self.task resume];

    self.resumeData = nil;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值