美文网首页
OC网络:NSURLSession-downloadTask的断

OC网络:NSURLSession-downloadTask的断

作者: cyh老崔 | 来源:发表于2015-12-10 15:16 被阅读226次

NSURLSessionDownloadDelegate断点下载说明:

  • 能实现断点下载,即在程序不退出的情况下:暂停,继续;暂停,继续.
  • 但是不能实现离线断点下载.即在下载过程中,程序突然退出.再登陆时不能根据上次下载的进度继续下载.因为系统downloadTask默认保存在沙盒temp中,随时可能被清除,再次登陆时,可能上次保存的下载文件已经被删除.

具体代码如下

@interface ViewController ()<NSURLSessionDownloadDelegate>
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** download data task */
@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;
/** 继续下载时,从哪里开始下载 */
@property (nonatomic, strong) NSData *resumeData;
@property (nonatomic, strong) NSURLSession *session;

@end

@implementation ViewController

#pragma mark -------------------------------
#pragma mark lazy load NSURLSession
- (NSURLSession *)session{
    if (!_session) {
        _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    }
    return _session;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *url  = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/2.mp4"];
    self.downloadTask = [self.session downloadTaskWithURL:url];
}

//控制下载下暂停的按钮的点击事件
- (IBAction)playClick:(UIButton *)sender {
    sender.selected = !sender.isSelected;
    
    if (sender.selected) {//执行下载操作
        if (self.resumeData.length != 0) {
            [self resume];
        }else{
            [self start];
        }
    }else{//暂停操作
        [self suspend];
    }
}

- (void)start{
    [self.downloadTask resume];
}

- (void)suspend{
    
    //block语句块中引用了self,为防止循环引用,需要弱引用self
    __weak typeof(self) weakSelf = self;
    
    [self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
        //resumeData:即为下次下载数据时的开始点,即上次下载的结束点
        weakSelf.resumeData = resumeData;
    }];
}

- (void)resume{
    
    self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
    [self.downloadTask resume];
}

#pragma mark -------------------------------
#pragma mark NSURLSessionDownloadDelegate
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    
    self.progressView.progress = (double)totalBytesWritten / totalBytesExpectedToWrite;

}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
    }

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    
    //下载完成后,将下载数据转移至caches
    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
    NSString *fullPath = [cachesPath stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    NSFileManager *manager = [NSFileManager defaultManager];
    [manager moveItemAtPath:location.path toPath:fullPath error:nil];
    
}

不能实现离线下载,是专门处理下载任务的downloadTask的bug.可用NSURLSessionDataTask实现.

相关文章

  • OC网络:NSURLSession-downloadTask的断

    NSURLSessionDownloadDelegate断点下载说明: 能实现断点下载,即在程序不退出的情况下:暂...

  • OC的网络

  • 网络监测之AFNetwork

    一、AFNetworing检测网络 ```OC AFNetworkReachabilityManager *man...

  • OC网络相关

    一.URL{1. 格式:协议头://主机地址/路径2. 协议头:{a. HTTP:// 超文本传输协议b. FTP...

  • OC网络封装

    开发时习惯将接口返回的json数据转化为我们自己的model类来使用,那么将json解析和转model封装起来,网...

  • 在swift项目中实现网络请求层的思路

    刚开始写swift的时候是用写OC的思路方法在写swift,OC里面写网络请求的思路是,封装一个网络请求类(以下简...

  • 全局断点的配置

    全局断点抛出可以只断oc的可避免一些异常抛出的中断

  • 「网络断食」24小时

    日更第135天,聊聊「网络断食」: 2月8日的14:00,我开始为期24小时的“网络断食”。所谓的“网络断食”,就...

  • 2019-06-11

    OC AFN监测网络连接状态 1.获得网络监控的管理者 AFNetworkReachabilityManager ...

  • iOS全解12:第三方库的解读

    一、常用库 网络:AFNetWorking(OC)、Alamofire(swift)、SocketRocket、R...

网友评论

      本文标题:OC网络:NSURLSession-downloadTask的断

      本文链接:https://www.haomeiwen.com/subject/jbkyhttx.html