图片的异步下载
2015-09-12 14:46
239 查看
网络连接无论是同步还是异步,其图片的下载都是同步下载,比较卡顿,故此采用异步连接是非常有必要的
一、图⽚下载是iOS开发中常⽤的功能,但系统并未提供图⽚下载类。
为了便于后续使⽤,可以将图⽚下载封装到⼀个类⾥⾯ (ImageDownloader)。 ImageDownloader 允许外界指定URL,提供开始下载和取消下载功能,并提供delegate或block将图⽚传递给外界。
二、代理方式的异步下载
下面直接上代码段,在.h 文件中声明协议,并设置代理
在 .m 文件中
这样一来我们就可以在外界使用这个类,来实现图片的异步下载功能。
一、图⽚下载是iOS开发中常⽤的功能,但系统并未提供图⽚下载类。
为了便于后续使⽤,可以将图⽚下载封装到⼀个类⾥⾯ (ImageDownloader)。 ImageDownloader 允许外界指定URL,提供开始下载和取消下载功能,并提供delegate或block将图⽚传递给外界。
二、代理方式的异步下载
下面直接上代码段,在.h 文件中声明协议,并设置代理
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @class ImageDownloader; @protocol ImageDownloaderDelegate <NSObject> @optional - (void)imageDownloader:(ImageDownloader *)imageDownloader successDownloadImage:(UIImage *)image; - (void)imageDownloader:(ImageDownloader *)imageDownloader didFailWirhError:(NSError *)error; @end @interface ImageDownloader : NSObject // 需要外界提供网址 - (instancetype)initWithURLStr:(NSString *)urlstr delegate:(id<ImageDownloaderDelegate>)delegate; // 遍历构造器,方便外界使用 + (ImageDownloader *)imageDownloaderWithURLStr:(NSString *)urlStr delegate:(id<ImageDownloaderDelegate>)delegate; @end
在 .m 文件中
#import "ImageDownloader.h" @interface ImageDownloader ()<NSURLConnectionDataDelegate>{ id<ImageDownloaderDelegate>_delegate;// 定义实例变量,目的是为了在其他方法中使用_delegate } @property(nonatomic, retain)NSMutableData *receivedData; @end @implementation ImageDownloader - (void)dealloc { [_receivedData release]; [super dealloc]; } - (NSMutableData *)receivedData{ if (_receivedData == nil) { self.receivedData = [NSMutableData dataWithCapacity:0]; } return _receivedData; } - (instancetype)initWithURLStr:(NSString *)urlstr delegate:(id<ImageDownloaderDelegate>)delegate{ self = [super init]; if (self) { NSURL *url = [NSURL URLWithString:urlstr]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease] ; _delegate = delegate; } return self; } + (ImageDownloader *)imageDownloaderWithURLStr:(NSString *)urlStr delegate:(id<ImageDownloaderDelegate>)delegate{ ImageDownloader *imageDownloader = [[[ImageDownloader alloc] initWithURLStr:urlStr delegate:delegate] autorelease]; return imageDownloader; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ [self.receivedData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection{ if (_delegate && [_delegate respondsToSelector:@selector(imageDownloader: successDownloadImage: )]) { UIImage *image = [UIImage imageWithData:self.receivedData]; [_delegate imageDownloader:self successDownloadImage:image]; } } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ if (_delegate && [_delegate respondsToSelector:@selector(imageDownloader:didFailWirhError:)]) { NSError *error = nil; [_delegate imageDownloader:self didFailWirhError:error]; } } @end
这样一来我们就可以在外界使用这个类,来实现图片的异步下载功能。
相关文章推荐
- ExtJs jsonStore加载的监听
- 【智力问题】25匹马赛跑,每次只能跑5匹马,最快能赛几次找出跑得最快的3匹马?赛跑不能计时,并假设每匹马的速度是恒定不变的。
- JS-面向对象-封装
- 软件工程的文档
- (5.2.2)TCP和UDP的区别(转)
- Java学习之基本数据类型
- UIViewContentMode
- Swift程式语言(中国版)(8.8 %)
- CentOS6.3 安装 memcached
- 开发web app并且使用phonegap下载及打开附件
- Ubuntu14.04使用内存盘
- 《GPUPro》笔记
- Windows批处理学习之批处理简单编程
- 离github在导入dubbo工程
- Mac系统的终端命令集合
- block学习笔记
- mysql主从配置
- TCP三次握手、四次挥手
- win7 64位旗舰版电脑如何提高鼠标的精准度?提高鼠标的精准度的方法
- 代码洁癖症