網絡鏈接不管是同步仍是異步,其圖片的下載都是同步下載,比較卡頓,故此採用異步鏈接是很是有必要的網絡
1、圖⽚下載是iOS開發中常⽤的功能,但系統並未提供圖⽚下載類。 app
爲了便於後續使⽤,能夠將圖⽚下載封裝到⼀個類⾥⾯ (ImageDownloader)。 ImageDownloader 容許外界指定URL,提供開始下載和取消下載功能,並提供delegate或block將圖⽚傳遞給外界。
異步
2、代理方式的異步下載atom
下面直接上代碼段,在.h 文件中聲明協議,並設置代理url
#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 文件中spa
#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
這樣一來咱們就能夠在外界使用這個類,來實現圖片的異步下載功能。代理