关于NSURLSessionDownloadTask下载大文件

/**

 下载文件

 */

@interface DownloadFileItem : NSObject

 

 

- (id)initWithDownloadFile:(NSString *)path;

 

/**

 暂停下载,可以恢复

 */

- (void)suspend;

 

/**

 取消,不可以恢复

 */

- (void)cancel;

 

/**

 开始下载

 */

- (void)start;

 

@end

 

@interface DownloadFileItem () <NSURLSessionDownloadDelegate>

 

/**

 下载任务

 */

@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;

 

/**

 下载的数据信息

 */

@property (nonatomic, strong) NSData *resumeData;

 

/**

 下载的会话

 */

@property (nonatomic, strong) NSURLSession *session;

 

@end

 

@implementation DownloadFileItem

 

- (id)initWithDownloadFile:(NSString *)path

{

    if (self = [super init])

    {

        self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

        NSURL *url = [NSURL URLWithString:path];

        self.downloadTask = [self.session downloadTaskWithURL:url];

    }

    return self;

}

 

 

/**

 暂停下载,可以恢复

 */

- (void)suspend

{

    [self.downloadTask suspend];

}

 

/**

 取消,不可以恢复

 */

- (void)cancel

{

    [self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {

        self.resumeData = resumeData;

    }];

}

 

/**

 开始下载

 */

- (void)start

{

    if (_resumeData)

    {

        NSURLSessionDownloadTask *downloadTask = [_session downloadTaskWithResumeData:_resumeData];

        self.downloadTask = downloadTask;

    }

    [self.downloadTask resume];

}

 

 

#pragma mark NSURLSessionDownloadDelegate

// 下载了数据的过程中会调用的代理方法

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

{

    NSLog(@"%1f", 1.0 * 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

{

    NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];

    [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];

    NSLog(@"fullPath=%@", fullPath);

}

 

// 请求完成,错误的时候调用

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

{

    

}

 

 

 

@end

 

posted on 2017-01-19 09:33  TangBin604  阅读(105)  评论(0编辑  收藏  举报

导航