iOS异步下载下载进度条显示
说到http异步下载,首先要知道其中的关键类。
关键类是NSURLConnection NSURLRequest NSMutableURLRequest
委托是 NSURLConnectionDownloadDelegate NSURLConnectionDataDelegate NSURLConnectionDelegate
首先,我们要实现最基本的下载功能。
LQAsynDownload.h

//
// LQAsynDownload.h
// lgTest
//
// Created by yons on 14-2-14.
// Copyright (c) 2014年 GQ. All rights reserved.
// #import <Foundation/Foundation.h> @interface LQAsynDownload : NSObject<NSURLConnectionDataDelegate> @property (strong) NSURL *httpURL; + (LQAsynDownload *) initWithURL:(NSURL *) url; - (void) startAsyn; @end

LQAsynDownload.m

//
// LQAsynDownload.m
// lgTest
//
// Created by yons on 14-2-14.
// Copyright (c) 2014年 GQ. All rights reserved.
// #import "LQAsynDownload.h" @interface LQAsynDownload() @property (assign) long long contentLength; @property (assign) long long receiveLength; @property (strong) NSMutableData *receiveData; @property (strong) NSString *fileName; @property (strong) NSURLConnection *theConnection; @property (strong) NSURLRequest *theRequest; @end @implementation LQAsynDownload @synthesize receiveData = _receiveData, fileName = _fileName,
theConnection=_theConnection, theRequest=_theRequest; + (LQAsynDownload *) initWithURL:(NSURL *) url{
LQAsynDownload *asynDownload = [[LQAsynDownload alloc] init];
asynDownload.theRequest=[NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
return asynDownload;
} - (void) startAsyn{
_contentLength=0;
_receiveLength=0;
self.receiveData = [[NSMutableData alloc] init];
self.theConnection = [[NSURLConnection alloc] initWithRequest:self.theRequest delegate:self];
} //接收到http响应
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
_contentLength = [response expectedContentLength];
_fileName = [response suggestedFilename];
NSLog(@"data length is %lli", _contentLength);
} //传输数据
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
_receiveLength += data.length;
[_receiveData appendData:data];
NSLog(@"data recvive is %lli", _receiveLength);
} //错误
- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
[self releaseObjs];
NSLog(@"%@",error.description);
} - (void) releaseObjs{
self.receiveData = nil;
self.fileName = nil;
self.theRequest = nil;
self.theConnection = nil;
} //成功下载完毕
- (void) connectionDidFinishLoading:(NSURLConnection *)connection{
//数据写入doument
//获取完整目录名字
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *savePath = [NSString stringWithFormat:@"%@/%@",documentsDirectory, _fileName];
//创建文件
[_receiveData writeToFile:savePath atomically:YES];
[self releaseObjs];
} @end

最简单的功能调用代码:
LQAsynDownload *dwn = [LQAsynDownload initWithURL:[[NSURL alloc] initWithString:@"http://t2.baidu.com/it/u=0,3067863433&fm=19&gp=0.jpg"]];
[dwn startAsyn];
查查模拟器,神啊,MM靓图出现了

情人节努力的补充礼物,哈哈。

关键点分析:
其实就是实现NSURLConnectionData委托的几个方法:
这个方法是客户端接收到回应后的调用方法,算是下载的开始。
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
跟着就是接收数据的方法
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
还有一个遇到错误时的处理方法
- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
最后是下载成功调用的方法
- (void) connectionDidFinishLoading:(NSURLConnection *)connection
接着实现,下载进度查看。
在原代码基础上增加2个block 属性。
LQAsynDownload.h

1 //
2 // LQAsynDownload.h
3 // lgTest
4 //
5 // Created by yons on 14-2-14.
6 // Copyright (c) 2014年 GQ. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10
11 typedef void (^initProgress)(long long initValue);
12
13 typedef void (^loadedData)(long long loadedLength);
14
15 @interface LQAsynDownload : NSObject<NSURLConnectionDataDelegate>
16
17 @property (strong) NSURL *httpURL;
18
19 @property (copy) void (^initProgress)(long long initValue);
20
21 @property (copy) void (^loadedData)(long long loadedLength);
22
23 + (LQAsynDownload *) initWithURL:(NSURL *) url;
24
25 - (void) startAsyn;
26
27 @end

LQAsynDownload.m

1 //
2 // LQAsynDownload.m
3 // lgTest
4 //
5 // Created by yons on 14-2-14.
6 // Copyright (c) 2014年 GQ. All rights reserved.
7 //
8
9 #import "LQAsynDownload.h"
10
11 @interface LQAsynDownload()
12
13 @property (assign) long long contentLength;
14
15 @property (assign) long long receiveLength;
16
17 @property (strong) NSMutableData *receiveData;
18
19 @property (strong) NSString *fileName;
20
21 @property (strong) NSURLConnection *theConnection;
22
23 @property (strong) NSURLRequest *theRequest;
24
25 @end
26
27 @implementation LQAsynDownload
28
29 @synthesize receiveData = _receiveData, fileName = _fileName,
30 theConnection=_theConnection, theRequest=_theRequest;
31
32 + (LQAsynDownload *) initWithURL:(NSURL *) url{
33 LQAsynDownload *asynDownload = [[LQAsynDownload alloc] init];
34 asynDownload.theRequest=[NSURLRequest requestWithURL:url
35 cachePolicy:NSURLRequestUseProtocolCachePolicy
36 timeoutInterval:60.0];
37 // create the connection with the request
38 // and start loading the data
39 return asynDownload;
40 }
41
42 - (void) startAsyn{
43 _contentLength=0;
44 _receiveLength=0;
45 self.receiveData = [[NSMutableData alloc] init];
46 self.theConnection = [[NSURLConnection alloc] initWithRequest:self.theRequest delegate:self];
47 }
48
49 //接收到http响应
50 - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
51 _contentLength = [response expectedContentLength];
52 _fileName = [response suggestedFilename];
53 if (self.initProgress != nil) {
54 self.initProgress(_contentLength);
55 }
56 NSLog(@"data length is %lli", _contentLength);
57 }
58
59 //传输数据
60 -(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
61 _receiveLength += data.length;
62 [_receiveData appendData:data];
63 if (self.loadedData != nil) {
64 self.loadedData(data.length);
65 }
66 NSLog(@"data recvive is %lli", _receiveLength);
67 }
68
69 //错误
70 - (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
71 [self releaseObjs];
72 NSLog(@"%@",error.description);
73 }
74
75 - (void) releaseObjs{
76 self.receiveData = nil;
77 self.fileName = nil;
78 self.theRequest = nil;
79 self.theConnection = nil;
80 }
81
82 //成功下载完毕
83 - (void) connectionDidFinishLoading:(NSURLConnection *)connection{
84 //数据写入doument
85 //获取完整目录名字
86 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
87 NSString *documentsDirectory = [paths objectAtIndex:0];
88 NSString *savePath = [NSString stringWithFormat:@"%@/%@",documentsDirectory, _fileName];
89 //创建文件
90 [_receiveData writeToFile:savePath atomically:YES];
91 [self releaseObjs];
92 }
93
94
95 @end

调用代码:

1 LQAsynDownload *dwn = [LQAsynDownload initWithURL:[[NSURL alloc] initWithString:@"http://a.hiphotos.baidu.com/image/w%3D2048/sign=fae75ab5d63f8794d3ff4f2ee6230ff4/faedab64034f78f09f9423fe7b310a55b3191c1b.jpg"]];
2
3 dwn.initProgress = ^(long long initValue){
4 _sum = initValue;
5 NSLog(@"%lli",initValue);
6 _rcv = 0;
7 dispatch_async(dispatch_get_main_queue(), ^{
8 self.pv.progress = 0.0;
9 self.pv.hidden = NO;
10 });
11 };
12
13 dwn.loadedData = ^(long long loadedLength){
14 dispatch_async(dispatch_get_main_queue(), ^{
15 if (_rcv == _sum) {
16 self.pv.hidden = YES;
17 } else {
18 _rcv += loadedLength;
19 self.pv.progress = _rcv/_sum;
20 }
21 });
22 };
23
24 [dwn startAsyn];

真相:

iOS异步下载下载进度条显示的更多相关文章
- python实现socket上传下载文件-进度条显示
在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示: 1. 服务器端代码如下: [root@python 519]# cat server.p ...
- iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 使用 new XMLHttpRequest() 制作下载文件进度条
mui 进度控件使用方法: 检查当前容器(container控件)自身是否包含.mui-progressbar类: 当前容器包含.mui-progressbar类,则以当前容器为目标控件,直接显示进度 ...
- 赵雅智_android多线程下载带进度条
progressBar说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度. 一个进度条也可不确定其进度.在不确定模式下, ...
- iOS UIWebView 加载进度条的使用-WKWebView的使用,更新2017.6.26
1.由于项目中加载网络插件,直接使用了webview加载.使用了三方NJKWebViewProgress进度条的使用,近期在测试时发现,网络缓慢时出现白屏,有卡顿现象. 于是采用了WKWebView进 ...
- 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示
尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...
- Unity 异步加载 进度条
当我们进行游戏开发时,时常会进行场景切换,如果下个场景较大,切换时就会出现卡顿现象,甚至看起来像是"死机",非常影响用户体验,我们这时就可以运用异步加载,在界面上显示加载的进度条以 ...
- 【Winform】使用BackgroundWorker控制进度条显示进度
许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...
- Extjs 使用fileupload插件上传文件 带进度条显示
一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...
- Ajax上传文件进度条显示
要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...
随机推荐
- 全面解读python web 程序的9种部署方式
转载自鲁塔弗的博客,本文地址http://lutaf.com/141.htm python有很多web 开发框架,代码写完了,部署上线是个大事,通常来说,web应用一般是三层结构 web serve ...
- WKWebView捕获HTML弹出的Alert和Confirm
之前用WebView装载一个网页时,弹出Alert时会显示网址,由于不想把网址暴露给用户这样显示就不是很友好了.UIWebView文档内没有找到可以捕获这类信息的API.GOOGLE了下发现了WKWe ...
- 监听grid行点击事件
- servlet 中文乱码问题
两步骤搞定: 1,修改tomcat的server.xml <Connector port="8080" protocol="HTTP/1.1" conne ...
- JS使构造函数与new操作符无关
function User(name, passwordHash) { this.name = name; this.passwordHash = passwordHash; } 当使用User函数创 ...
- IntelliJ IDEA,代码行宽度超出限制时自动换行
转自:http://my.oschina.net/angerbaby/blog/471351 当我们使用IDE写代码时,为了保证代码的可阅读性和优雅性,通常会借助IDE的代码风格设置功能,令IDE智能 ...
- MySQL5.6 实现主从复制,读写分离,分散单台服务器压力
闲来无事,在本地搭建几台虚拟机,准备配一个mysql读写分离的主从配置,版本选用最新版的,mysql.5.6.28 版本,本处使用源码安装(鄙人一向喜欢源码安装,因为centos中鄙人不知道yum安装 ...
- grootJsAPI文档
groot.view(name,factory) 用于创建一个modelView对象与指令gt-view对应 参数 用途 name 创建的modelView的名称,用groot.vms[name]可以 ...
- TCP/IP中最高大上的链路层简介(二)
引言 对于程序猿来讲,似乎越接近底层,就越显得高大上.这也算是程序猿们的共同认知吧,虽然不是所有人.今天LZ就和各位一起探讨一下TCP/IP中最高大上的一层,也就是最底层的链路层. 这一层LZ了解的还 ...
- Python时间性能测量
主要有以下三种方式: 一,CPU时间 time.clock() 测量CPU时间,比较精准,通过比较程序运行前后的CPU时间差,得出程序运行的CPU时间. 二, 时钟时间 time.time() 测量时 ...