圖片的異步下載

網絡鏈接不管是同步仍是異步,其圖片的下載都是同步下載,比較卡頓,故此採用異步鏈接是很是有必要的網絡


 

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

這樣一來咱們就能夠在外界使用這個類,來實現圖片的異步下載功能。代理

相關文章
相關標籤/搜索