NSURLSession实现断点下载

NSURLSession实现断点下载

@interface

HMViewController
() <NSURLSessionDownloadDelegate,

NSURLSessionDataDelegate]]>

@property
(weak,

nonatomic)

IBOutlet
UIProgressView *progressView;

- (IBAction)download:(UIButton
*)sender;

@property
(nonatomic,

strong)
NSURLSessionDownloadTask
*task;

@property
(nonatomic,

strong)
NSData *resumeData;

@property
(nonatomic,

strong)
NSURLSession *session;

@end

@implementation
HMViewController

- (NSURLSession
*)session

{

if (!_session) {

//
获得session

NSURLSessionConfiguration
*cfg = [NSURLSessionConfiguration
defaultSessionConfiguration];

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

}

return
_session;

}

- (IBAction)download:(UIButton
*)sender {

//
按钮状态取反

sender.selected
= !sender.isSelected;

if (self.task
==
nil) {
//
开始(继续)下载

if (self.resumeData)
{
//
恢复

[self
resume];

}
else {
//
开始

[self
start];

}

}
else {
//
暂停

[self
pause];

}

}

/**


从零开始

*/

- (void)start

{

// 1.创建一个下载任务

NSURL *url = [NSURL
URLWithString:@"http://192.168.15.172:8080/MJServer/resources/videos/minion_01.mp4"];

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

// 2.开始任务

[self.task
resume];

}

/**


恢复(继续)

*/

- (void)resume

{

//
传入上次暂停下载返回的数据,就可以恢复下载

self.task
= [self.session
downloadTaskWithResumeData:self.resumeData];

//
开始任务

[self.task
resume];

//
清空

self.resumeData
=
nil;

}

/**


暂停

*/

- (void)pause

{

__weak
typeof(self) vc =

self;

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

//  resumeData :
包含了继续下载的开始位置\下载的url

vc.resumeData
= resumeData;

vc.task
=
nil;

}];

}

#pragma mark - NSURLSessionDownloadDelegate

- (void)URLSession:(NSURLSession
*)session downloadTask:(NSURLSessionDownloadTask
*)downloadTask

didFinishDownloadingToURL:(NSURL
*)location

{

NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask,

YES)
lastObject];

// response.suggestedFilename

建议使用的文件名,一般跟服务器端的文件名一致

NSString *file = [caches
stringByAppendingPathComponent:downloadTask.response.suggestedFilename];

//
将临时文件剪切或者复制Caches文件夹

NSFileManager *mgr = [NSFileManager
defaultManager];

// AtPath :
剪切前的文件路径

// ToPath :
剪切后的文件路径

[mgr
moveItemAtPath:location.path
toPath:file
error:nil];

}

- (void)URLSession:(NSURLSession
*)session downloadTask:(NSURLSessionDownloadTask
*)downloadTask

didWriteData:(int64_t)bytesWritten

totalBytesWritten:(int64_t)totalBytesWritten

totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

{

NSLog(@"获得下载进度--%@",
[NSThread
currentThread]);

//
获得下载进度

self.progressView.progress
= (double)totalBytesWritten / totalBytesExpectedToWrite;

}

- (void)URLSession:(NSURLSession
*)session downloadTask:(NSURLSessionDownloadTask
*)downloadTask

didResumeAtOffset:(int64_t)fileOffset

expectedTotalBytes:(int64_t)expectedTotalBytes

{

}

时间: 2024-11-09 02:01:24

NSURLSession实现断点下载的相关文章

NSURLSession 后台断点下载

?只支持同时一个下载任务 ?注释部分可能有理解的不对的地方 ?GitHub地址:https://github.com/liuyongfa/LYFBackgroundDownloadDemo.git NSURLSession可以执行长时间的后台下载任务.进入后台后,下载任务可以一直执行.被杀死后,再次进入App会根据NSURLSessionConfiguration的identifier继续下载.下载成功后,可以调用LocalNotification做通知. AppDelegate.m #impo

NSURLSession的断点下载

#import "ViewController.h" @interface ViewController () <NSURLSessionDownloadDelegate, NSURLSessionDataDelegate> @property (weak, nonatomic) IBOutlet UIProgressView *progressView; - (IBAction)download:(UIButton *)sender; @property (nonatom

iOS开发网络请求——大文件的多线程断点下载

iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大小比较小导致传输所需时间少传输就快,因此不太容易影响用户体验,可用的技术就多.而大文件因为文件大小比较大导致传输时间长,因此就需要考虑到各种用户体验,比如避免在上传下载文件过程中阻塞主线程影响用户体验,就需要使用到多线程技术:为了给用户友好的进度提示,因此又需要开发中跟踪数据上传和下载数据的变化:为

ios开发网络学习十一:NSURLSessionDataTask离线断点下载(断点续传)

#import "ViewController.h" #define FileName @"121212.mp4" @interface ViewController ()<NSURLSessionDataDelegate> @property (weak, nonatomic) IBOutlet UIProgressView *proessView; /** 接受响应体信息 */ @property (nonatomic, strong) NSFile

iOS网络-NSURLSessionDataTask大文件离线断点下载

什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载 代码实现如下: #import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> //输出流 @property (nonatomic, strong) NSOutputStream *stream ; //Task对象 @property (nonatomic, strong) NSURLSessionDataT

IOS断点下载

下载的一些用法 ①对于小文件,可以直接下载,无需断点下载等处理. 1 -(void)clickDownBtn{ 2 NSURL *url = [NSURL URLWithString:@"https://picjumbo.imgix.net/HNCK8461.jpg?q=40&w=1650&sharp=30"]; 3 if (self.imgView.image == nil) { 4 [self downLoad:url]; 5 } 6 } 7 8 //下载过程 9

iOS- 利用AFNetworking(AFN) - 实现文件断点下载

iOS- 利用AFNetworking(AFN) - 实现文件断点下载 官方建议AFN的使用方法 1. 定义一个全局的AFHttpClient:包含有 1> baseURL 2> 请求 3> 操作队列 NSOperationQueue 2. 由AFHTTPRequestOperation负责所有的网络操作请求 0.导入框架准备工作 •1. 将框架程序拖拽进项目 •2.  添加iOS框架引用 –SystemConfiguration.framework –MobileCoreService

iOS 大文件断点下载

iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"resumeData.tmp"] #import

ios:NSURLSessionDataTask做文件断点下载

之前用afn2.x的AFHttpOperation结合sqlite数据库管理做了文件的断点下载功能,之后苹果宣布要开始限制ipv4,不过AFN的东西时给予high-level的APIs的,因此不需要修改,但是国外的开发者建议使用AFN3.0版本. 闲来无事就想重新集成一下,迁移AFN3.0的时候因为没有了HTTPOperation,所以在修改代码的时候全部用NSURLSessionDowonloadTask代替,不过由于之前的数据库逻辑已经定型,且多处使用,修改起来比较复杂,DownloadTa