说到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异步下载下载进度条显示的更多相关文章

  1. python实现socket上传下载文件-进度条显示

    在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示: 1. 服务器端代码如下: [root@python 519]# cat server.p ...

  2. iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. 使用 new XMLHttpRequest() 制作下载文件进度条

    mui 进度控件使用方法: 检查当前容器(container控件)自身是否包含.mui-progressbar类: 当前容器包含.mui-progressbar类,则以当前容器为目标控件,直接显示进度 ...

  4. 赵雅智_android多线程下载带进度条

    progressBar说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度. 一个进度条也可不确定其进度.在不确定模式下, ...

  5. iOS UIWebView 加载进度条的使用-WKWebView的使用,更新2017.6.26

    1.由于项目中加载网络插件,直接使用了webview加载.使用了三方NJKWebViewProgress进度条的使用,近期在测试时发现,网络缓慢时出现白屏,有卡顿现象. 于是采用了WKWebView进 ...

  6. 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示

    尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...

  7. Unity 异步加载 进度条

    当我们进行游戏开发时,时常会进行场景切换,如果下个场景较大,切换时就会出现卡顿现象,甚至看起来像是"死机",非常影响用户体验,我们这时就可以运用异步加载,在界面上显示加载的进度条以 ...

  8. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  9. Extjs 使用fileupload插件上传文件 带进度条显示

    一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...

  10. Ajax上传文件进度条显示

    要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...

随机推荐

  1. AppStore 上架注意事项及错误修改

    1.上架之前首页要配置好发布证书,配置用于发布的配置文件. 2.必须上传3.5英寸和4英寸图片,这两种图片尺寸不能缺. 3.提交的版本必须是在8.0及以上的版本. 4.必须用发布证书,如果提示UUID ...

  2. css3属性选择器

  3. html代码中显示系统时间

    可以显示系统的静态时间和动态时间 1,静态时间 <script type="text/javascript"> var myDate = new Date(); doc ...

  4. switch2osm使用open street map离线地图中文乱码方框解决办法

    ----------written by shenwenkai------------- ubuntu linux环境下,按照网址(https://switch2osm.org/serving-til ...

  5. C# 发送邮件,QQ企业邮箱测试成功

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  6. Linux shell循环

    条件测试 格式 test condition 或 [ condition ] 使用方括号时,要注意在条件两边加上空格,如果有操作符,运算符之间也必须有空格 测试状态:测试的结果可以用$?的值来判断,0 ...

  7. MPI+WIN10并行试运行

    系统:2015 win10专业版 x64 MPI安装包:mpich2-1.4.1p1-win-x86-64.man 将后缀改为.msi 以管理员身份安装 安装过程一路默认,注意<behappy为 ...

  8. 如何在 ie6 中使用 "localStorage"

    好吧,我只是个标题党,ie6 下根本无法使用跟 h5 沾边的 localStorage.今天要向大家介绍的是 ie 特有的 userData 的存储方式,并且对它进行封装,使得不支持 localSto ...

  9. 2014 todo list

    1. 做好已知的各种项目,争取能成立固定团队2. 横向扩展技术学习,了解各种技术,加强技术素养3. 争取找个妹子4. 加强音律学习5. 继续发展各业余爱好6. 努力摇号 年底看收成.

  10. tomcat设置端口号和默认webapp

    tomcat一下载,解压之后webapps目录下自带几个webapp: * docs文档:这是一个静态页面集,不用启动tomcat也可以阅读 * examples样例 * hostmanager主机管 ...