1,model文件代码

文件名称:HMFileDownloader.h

#import <Foundation/Foundation.h>

@interface HMFileDownloader : NSObject

/**

* 所需要下载文件的远程URL(连接服务器的路径)

*/

@property (nonatomic, copy) NSString *url;

/**

* 文件的存储路径(文件下载到什么地方)

*/

@property (nonatomic, copy) NSString *destPath;

/**

* 是否正在下载(有没有在下载, 只有下载器内部才知道)

*/

@property (nonatomic, readonly, getter = isDownloading) BOOL downloading;

/**

* 用来监听下载进度

*/

@property (nonatomic, copy) void (^progressHandler)(double progress);

/**

* 用来监听下载完毕

*/

@property (nonatomic, copy) void (^completionHandler)();

/**

* 用来监听下载失败

*/

@property (nonatomic, copy) void (^failureHandler)(NSError *error);

/**

* 开始(恢复)下载

*/

- (void)start;

/**

* 暂停下载

*/

- (void)pause;

@end

文件名称:HMFileDownloader.m

#import "HMFileDownloader.h"

@interface HMFileDownloader() <NSURLConnectionDataDelegate>

/**

* 连接对象

*/

@property (nonatomic, strong) NSURLConnection *conn;

/**

*  写数据的文件句柄

*/

@property (nonatomic, strong) NSFileHandle *writeHandle;

/**

*  当前已下载数据的长度

*/

@property (nonatomic, assign) long long currentLength;

/**

*  完整文件的总长度

*/

@property (nonatomic, assign) long long totalLength;

@end

@implementation HMFileDownloader

/**

* 开始(恢复)下载

*/

- (void)start

{

NSURL *url = [NSURL URLWithString:self.url];

// 默认就是GET请求

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 设置请求头信息

NSString *value = [NSString stringWithFormat:@"bytes=%lld-", self.currentLength];

[request setValue:value forHTTPHeaderField:@"Range"];

self.conn = [NSURLConnection connectionWithRequest:request delegate:self];

_downloading = YES;

}

/**

* 暂停下载

*/

- (void)pause

{

[self.conn cancel];

self.conn = nil;

_downloading = NO;

}

#pragma mark - NSURLConnectionDataDelegate 代理方法

/**

*  1. 当接受到服务器的响应(连通了服务器)就会调用

*/

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

#warning 一定要判断

if (self.totalLength) return;

// 1.创建一个空的文件到沙盒中

NSFileManager *mgr = [NSFileManager defaultManager];

// 刚创建完毕的大小是0字节

[mgr createFileAtPath:self.destPath contents:nil attributes:nil];

// 2.创建写数据的文件句柄

self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:self.destPath];

// 3.获得完整文件的长度

self.totalLength = response.expectedContentLength;

}

/**

*  2. 当接受到服务器的数据就会调用(可能会被调用多次, 每次调用只会传递部分数据)

*/

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

// 累加长度

self.currentLength += data.length;

NSLog(@"=%lld==",self.currentLength);

// 显示进度

double progress = (double)self.currentLength / self.totalLength;

if (self.progressHandler) { // 传递进度值给block

self.progressHandler(progress);

}

// 移动到文件的尾部

[self.writeHandle seekToEndOfFile];

// 从当前移动的位置(文件尾部)开始写入数据

[self.writeHandle writeData:data];

}

/**

*  3. 当服务器的数据接受完毕后就会调用

*/

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

// 清空属性值

self.currentLength = 0;

self.totalLength = 0;

if (self.currentLength == self.totalLength) {

// 关闭连接(不再输入数据到文件中)

[self.writeHandle closeFile];

self.writeHandle = nil;

}

if (self.completionHandler) {

self.completionHandler();

}

}

/**

*  请求错误(失败)的时候调用(请求超时\断网\没有网, 一般指客户端错误)

*/

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

if (self.failureHandler) {

self.failureHandler(error);

}

}

@end

2、将上述两个文件拖到工程中

3、在控制器文件中导入

#import "HMFileDownloader.h"

声明

@property (nonatomic, strong)NSString  *url;

@property (retain, nonatomic)  UIProgressView *progressView;

@property (nonatomic, strong) HMFileDownloader *fileDownloader;

- (void)viewDidLoad

{

_progressView=[[UIProgressView alloc]init];

_progressView.frame=CGRectMake(10, 150, 170, 20);

[self.view addSubview:_progressView];

[self fileDownloader];

}

- (void)fileDownloader

{

if (!_ViewCont.fileDownloader) {

_fileDownloader = [[HMFileDownloader alloc] init];

// 需要下载的文件远程URL

_fileDownloader.url = @"http://192.168.1.9:8080/wyhouAppServices/upload/app_user/iOS%207%20Cookbook.pdf";

// 文件保存到什么地方1

NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

NSString *filepath = [caches stringByAppendingPathComponent:@"20Cookbook.pdf"];

// 文件保存到什么地方2

NSURL *targetURL = [NSURL URLWithString:_ViewCont.fileDownloader.url];

NSString *docPath = [self documentsDirectoryPath];

// Combine the filename and the path to the documents dir into the full path

NSString *pathToDownloadTo = [NSString stringWithFormat:@"%@/%@", docPath, [targetURL lastPathComponent]];

_fileDownloader.destPath = pathToDownloadTo;

//        typeof(10) a = 20; // int a = 20;

__weak typeof(self) vc = self;

_fileDownloader.progressHandler = ^(double progress) {

vc.progressView.progress=progress;

//            _progressView.progress = progress;

};

_fileDownloader.completionHandler = ^{

NSLog(@"------下载完毕");

};

_fileDownloader.failureHandler = ^(NSError *error){

};

}else{

_progressView.progress= _ViewCont.progressView.progress;

__weak typeof(self) vc = self;

_fileDownloader.progressHandler = ^(double progress) {

vc.progressView.progress=progress;

//

};

NSLog(@"------");

}

//    return _fileDownloader;

}

-(void)dealloc{

_progressView.progress=_progressView.progress;

}

// 按钮文字: "开始", "暂停"

- (void)start { // self.currentLength == 200

if (_fileDownloader.isDownloading) { // 暂停下载

[_fileDownloader pause];

[_testBtn setTitle:@"恢复" forState:UIControlStateNormal];

} else { // 开始下载

[_fileDownloader start];

[_testBtn setTitle:@"暂停" forState:UIControlStateNormal];

}

}

iOS 下载功能:断点下载(暂停和开始)(NSURLConnectionDataDelegate方法)的更多相关文章

  1. iOS 大文件断点下载

    iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...

  2. Android -- 多线程下载, 断点下载

    1. 原理图 2. 示例代码 需要权限 <uses-permission android:name="android.permission.INTERNET"/> &l ...

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

    iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...

  4. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  5. Java实现多线程断点下载(下载过程中可以暂停)

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...

  6. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  7. iOS开发网络篇—大文件的多线程断点下载

    http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...

  8. iOS开发网络篇—大文件的多线程断点下载(转)

    http://www.cnblogs.com/wendingding/p/3947550.html   iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了 ...

  9. iOS开发网络篇—多线程断点下载

    iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  10. ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)

    ABBPlayerKit ios开发视频播放后台下载功能实现 : 代码下载地址:https://github.com/niexiaobo/ABBPlayerKit github资料学习和下载地址:ht ...

随机推荐

  1. 使用VHD,让Win XP和 Win2003 运行在内存中

    通过一定的手段可以让XP和2003甚至Win7运行在内存中.我很感兴趣,于是按照网上的资料在VBox虚拟机中测试了一次,运行成功.这几天将其折腾到实体机上. 声明:我的做法和网上的做法有些不一样,我的 ...

  2. GO语言学习(二)Windows 平台下 LiteIDE 的安装和使用

    1. 安装 Go 语言并设置环境变量 参考GO语言学习(一) 2. MinGW 的下载和安装 Windows 下的 Go 调试还需要安装 MinGW. 2.1 下载安装工具的安装 最新版本下载安装工具 ...

  3. [D3] Build a Scatter Plot with D3 v4

    Scatter plots, sometimes also known as bubble charts, are another common type of visualization. They ...

  4. 像Bootstrap一样比较热门的前端框架有哪些

    像Bootstrap一样比较热门的前端框架有哪些 一.总结 一句话总结:框架大同小异,可以多去各自官网看看效果(比较一下各自的不同点(也就是提供的不同的功能)),然后根据需求选择用哪个.我觉得boot ...

  5. shiro 中的filterChainDefinitions详解(转)

    springrain使用shiro控制权限,配置filterChainDefinitions结合数据库校验权限. 我们在web.xml中配置一个全局过滤器,也就是在springrain配置的是一个sp ...

  6. vivado中basic memory生成

    vivado中basic memory生成

  7. MySQL—Install/Remove of the Service Denied

    在Windos7下通过命令"mysqld --install"安装MySQL数据库时出现了"Install/Remove of the Service Denied&qu ...

  8. leetcode-combination sum and combination sum II

    Combination sum: Given a set of candidate numbers (C) and a target number (T), find all unique combi ...

  9. 关于Android中设置闹钟的相对比较完善的解决方案

    我当时说承诺为大家写一个,一直没空,直到最近又有人跟我要,我决定抽时间写一个吧.确实设置闹钟是一个比较麻烦的东西.我在这里写的这个demo抽出来了封装了一个类库,大家直接调用其中的设置闹钟和取消闹钟的 ...

  10. [PReact] Handle Simple Routing with preact-router

    Some applications only need a very minimal routing solution. This lesson will cover a practical exam ...