/**
下载文件
*/
@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