ASIHTTPRequest这个框架就不多说了,这是一个很常用的ios开发框架
利用ASIHTTPRequest对传入的图片url进行对图片下载,下面我上一段关于图片下载的代码
#import "MDownloader.h"
@class MWebImage;
@protocol MWebImageDelegate <NSObject>
-(void)MWebImageStartLoad:(MWebImage *)webImage;
-(void)MWebImageFailLoad:(MWebImage *)webImage;
-(void)MWebImageFinishLoad:(MWebImage *)webImage Image:(UIImage *)image;
@end
@interface MWebImage : NSObject<DownloaderDelegate>{
MDownloader *imageDownloader;
NSString *imageUrl;
id<MWebImageDelegate> delegate;
BOOL isLoading;
}
@property(nonatomic, assign)id<MWebImageDelegate> delegate;
-(id)initWithImageUrl:(NSString *)url;
-(void)setImageURL:(NSString *)imageURL;
-(void)loadImage;
@end
#import "MWebImage.h"
@interface MWebImage()
@property(nonatomic, retain)MDownloader *imageDownloader;
@property(nonatomic, copy)NSString *imageUrl;
@end
@implementation MWebImage
@synthesize imageDownloader;
@synthesize imageUrl;
@synthesize delegate;
-(void)dealloc{
[imageDownloader cancel];
[imageDownloader cancelAllResponser];
[imageDownloader release];
[imageUrl release];
[super dealloc];
}
-(id)init{
self = [super init];
if(self){
self.imageDownloader = [[[MDownloader alloc] init] autorelease];
imageDownloader._delegate = self;
isLoading = NO;
}
return self;
}
-(id)initWithImageUrl:(NSString *)url{
self = [self init];
if(self){
[self setImageURL:url];
}
return self;
}
-(void)setImageURL:(NSString *)imageURL{
self.imageUrl = imageURL;
NSString *filename = [imageURL sha1];
[self.imageDownloader setURL:imageUrl SaveDir:KL_PATH_TMP_IMG_CACHE_DIR_PATH SaveFileName:filename ConnectinType:ConnectionTypeAsynchronously CacheType:CachedData];
}
-(void)loadImage{
if(isLoading)
return;
if(self.imageDownloader){
[imageDownloader download];
}
}
#pragma --- MDownloader delegate
-(void)downloaderDidStart:(MDownloader *)downloader{
isLoading = YES;
if([self.delegate respondsToSelector:@selector(MWebImageStartLoad:)]){
[self.delegate performSelector:@selector(MWebImageStartLoad:) withObject:self];
}
}
-(void)downloader:(MDownloader *)downloader didFailWithError:(NSString *)error{
isLoading = NO;
if([self.delegate respondsToSelector:@selector(MWebImageFailLoad:)]){
[self.delegate performSelector:@selector(MWebImageFailLoad:) withObject:self];
}
}
-(void)downloader:(MDownloader *)downloader didDownloadData:(NSData *)data{
isLoading = NO;
if([self.delegate respondsToSelector:@selector(MWebImageFinishLoad:Image:)]){
UIImage *image = [[UIImage imageWithData:data] retain];
[self.delegate performSelector:@selector(MWebImageFinishLoad:Image:) withObject:self withObject:[image autorelease]];
}
}
@end
再此处说明一下MDownloader(MDownloader此处没有写),这是我基于ASIHTTPRequest框架封装的一个下载器,里面的原理主要是这样的:
1.创建的时候 要指定下载数据类型 主要分为data 和 string
2.指定下载方式为异步还是同步
3.下载之前首先监测当前下载的文件是否存在,存在则利用filemanager读取,不存在开始下载 这个组件就不上代码了
4.图片缓存名称我将url采用sha1算法进行设置为缓存图片名称 关于sha1算法 自己可以去网上去找 我的sha1算法放在了公用类里 这里没有写
下面我创建了一个继承uiimageview的图片组件:
#import "MWebImage.h"
@class MWebImageView;
typedef void(^SuccessBlock)(UIImage *image);
typedef void(^FailureBlock)(NSError *error);
@protocol MWebImageViewDelegate <NSObject>
-(void)MWebImageViewFail:(MWebImageView *)webImageView;
-(void)MWebImageViewSuccess:(MWebImageView *)webImageView;
@end
@interface MWebImageView : UIImageView<MWebImageDelegate>{
NSString *imageURL;
MWebImage *webImageService;
id<MWebImageViewDelegate> delegate;
UIImage *placeHolder;
UIImage *failHolder;
UIActivityIndicatorView *actView;
BOOL imageFinishWithAnimation;
SuccessBlock success_;
FailureBlock fail_;
}
@property(nonatomic, assign)BOOL imageFinishWithAnimation;
@property(nonatomic, assign)id<MWebImageViewDelegate> delegate;
- (void)setImageWithStringUrl:(NSString *)strUrl placeHolderImage:(UIImage *)placeholder;
- (void)setImageWithStringUrl:(NSString *)strUrl placeHolderImage:(UIImage *)placeholder failHolderImage:(UIImage *)failholder;
- (void)setImageWithDomain:(NSString *)domain Name:(NSString *)name placeHolderImage:(UIImage *)placeholder;
- (void)setImageWithDomain:(NSString *)domain Name:(NSString *)name placeHolderImage:(UIImage *)placeholder failHolderImage:(UIImage *)failholder;
- (void)setImageWithStrURL:(NSString *)strUrl placeHolderImage:(UIImage *)placeholder success:(void (^)(UIImage *image))success failure:(void (^)(NSError *error))failure;
- (void)setImageWithStrURL:(NSString *)strUrl placeHolderImage:(UIImage *)placeholder failHolderImage:(UIImage *)failholder success:(void (^)(UIImage *image))success failure:(void (^)(NSError *error))failure;
- (void)setImageWithDomain:(NSString *)domain Name:(NSString *)name placeHolderImage:(UIImage *)placeholder success:(void (^)(UIImage *image))success failure:(void (^)(NSError *error))failure;
- (void)setImageWithDomain:(NSString *)domain Name:(NSString *)name placeHolderImage:(UIImage *)placeholder failHolderImage:(UIImage *)failholder success:(void (^)(UIImage *image))success failure:(void (^)(NSError *error))failure;
@end
#import "MWebImageView.h"
@interface MWebImageView()
@property(nonatomic, copy)NSString *imageURL;
@property(nonatomic, retain)MWebImage *webImageService;
@property(nonatomic, retain)UIImage *placeHolder;
@property(nonatomic, retain)UIImage *failHolder;
@property(nonatomic, retain)UIActivityIndicatorView *actView;
@property(nonatomic, copy)SuccessBlock success_;
@property(nonatomic, copy)FailureBlock fail_;
@end
@implementation MWebImageView
@synthesize imageURL;
@synthesize webImageService;
@synthesize placeHolder;
@synthesize failHolder;
@synthesize delegate;
@synthesize actView;
@synthesize success_;
@synthesize fail_;
@synthesize imageFinishWithAnimation;
-(void)dealloc{
[imageURL release];
[webImageService release];
[placeHolder release];
[failHolder release];
[actView release];
[success_ release];
[fail_ release];
[super dealloc];
}
-(id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if(self){
self.webImageService = [[[MWebImage alloc] init] autorelease];
webImageService.delegate = self;
self.actView = [[[UIActivityIndicatorView alloc] initWithFrame:self.bounds] autorelease];
actView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
[self addSubview:actView];
actView.hidden = YES;
imageFinishWithAnimation = NO;
}
return self;
}
-(void)setFrame:(CGRect)frame{
[super setFrame:frame];
self.actView.frame = self.bounds;
}
- (void)setImageWithStringUrl:(NSString *)strUrl placeHolderImage:(UIImage *)placeholder{
[self setImageWithStringUrl:strUrl placeHolderImage:placeholder failHolderImage:nil];
}
- (void)setImageWithDomain:(NSString *)domain Name:(NSString *)name placeHolderImage:(UIImage *)placeholder{
[self setImageWithDomain:domain Name:name placeHolderImage:placeholder failHolderImage:nil];
}
- (void)setImageWithDomain:(NSString *)domain Name:(NSString *)name placeHolderImage:(UIImage *)placeholder failHolderImage:(UIImage *)failholder{
[self setImageWithDomain:domain Name:name placeHolderImage:placeholder failHolderImage:failholder success:nil failure:nil];
}
- (void)setImageWithStringUrl:(NSString *)strUrl placeHolderImage:(UIImage *)placeholder failHolderImage:(UIImage *)failholder{
[self setImageWithStrURL:strUrl placeHolderImage:placeholder failHolderImage:failholder success:nil failure:nil];
}
- (void)setImageWithStrURL:(NSString *)strUrl placeHolderImage:(UIImage *)placeholder success:(void (^)(UIImage *image))success failure:(void (^)(NSError *error))failure{
[self setImageWithStrURL:strUrl placeHolderImage:placeholder failHolderImage:nil success:success failure:failure];
}
- (void)setImageWithDomain:(NSString *)domain Name:(NSString *)name placeHolderImage:(UIImage *)placeholder success:(void (^)(UIImage *image))success failure:(void (^)(NSError *error))failure{
[self setImageWithDomain:domain Name:name placeHolderImage:placeholder failHolderImage:nil success:success failure:failure];
}
- (void)setImageWithDomain:(NSString *)domain Name:(NSString *)name placeHolderImage:(UIImage *)placeholder failHolderImage:(UIImage *)failholder success:(void (^)(UIImage *image))success failure:(void (^)(NSError *error))failure{
[domain retain];
[name retain];
if(!(domain == nil || name == nil)){
NSString *strUrl = [domain stringByAppendingString:name];
[self setImageWithStrURL:strUrl placeHolderImage:placeholder failHolderImage:failholder success:success failure:failure];
}else{
[self setImage:placeholder];
}
[domain release];
[name release];
}
- (void)setImageWithStrURL:(NSString *)strUrl placeHolderImage:(UIImage *)placeholder failHolderImage:(UIImage *)failholder success:(void (^)(UIImage *image))success failure:(void (^)(NSError *error))failure{
if(success){
self.success_ = success;
}
if(failure){
self.fail_ = failure;
}
[strUrl retain];
self.placeHolder = placeholder;
self.failHolder = failholder;
dispatch_async(dispatch_get_main_queue(), ^{
[self setImage:placeholder];
});
if(!(strUrl == nil)){
[webImageService setImageURL:strUrl];
[webImageService loadImage];
}
[strUrl release];
}
#pragma --- MWebImage Delegate
-(void)MWebImageStartLoad:(MWebImage *)webImage{
dispatch_async(dispatch_get_main_queue(), ^{
[actView setHidden:NO];
[actView startAnimating];
});
}
-(void)MWebImageFailLoad:(MWebImage *)webImage{
dispatch_async(dispatch_get_main_queue(), ^{
[actView stopAnimating];
[actView setHidden:YES];
if(failHolder){
self.image = failHolder;
}else{
self.image = placeHolder;
}
});
if(fail_){
fail_(nil);
}
if([self.delegate respondsToSelector:@selector(MWebImageViewFail:)]){
[self.delegate performSelector:@selector(MWebImageViewFail:) withObject:self];
}
}
-(void)MWebImageFinishLoad:(MWebImage *)webImage Image:(UIImage *)image{
if(image){
dispatch_async(dispatch_get_main_queue(), ^{
[actView setHidden:YES];
[actView stopAnimating];
if(imageFinishWithAnimation){
[self setImageGradually:image];
}else{
self.image = image;
}
});
if(success_){
success_(image);
}
if([self.delegate respondsToSelector:@selector(MWebImageViewSuccess:)]){
[self.delegate performSelector:@selector(MWebImageViewSuccess:) withObject:self];
}
}else{
dispatch_async(dispatch_get_main_queue(), ^{
if(failHolder){
self.image = failHolder;
}else{
self.image = placeHolder;
}
});
if(fail_){
fail_(nil);
}
if([self.delegate respondsToSelector:@selector(MWebImageViewFail:)]){
[self.delegate performSelector:@selector(MWebImageViewFail:) withObject:self];
}
}
}
@end
说明一下:
1.我大概读了读sdwebimage的代码,所以也参照sdwebimage加入了block,主要负责成功和失败操作
2.若没有设置失败与成功的block 可以利用delegate来处理
3.可以指定显示图片是否以动画的显示 动画代码 [self setImageGradually:image]; 具体动画代码这里没有提供 可以自己去category image 写动画
具体用法如下:
[imageView setImageWithStrURL:[vo getContent]
placeHolderImage:[[MThemeManager sharedThemeManager] ImageNamed:KL_NEWS_CONTENT_IMAGE_DEFAULT_IMAGE]
success:^(UIImage *image) {
}failure:^(NSError *error) {
}
];