思路是:已存在的图片则从本地读取,本地不存在的图片则从网上下载到本地
在这里下载图片使用的是ASIHTTPRequest,
asi-http-request的使用参考:http://blog.csdn.net/marujunyy/article/details/8474518
下面是用法和自己写的一个类的代码:
现在需要使用它的类的.h文件中添加delegate,如下:
#import <UIKit/UIKit.h> #import "AsyncImageView.h" @interface RelatedAppsUIView : UIView<AsyncImageDelegate>{ __weak IBOutlet UIImageView *appImageView; } @end然后在使用它的类的.m文件中添加代理的方法,如下:
#import "RelatedAppsUIView.h" @implementation RelatedAppsUIView -(void)awakeFromNib{ AsyncImageView *asyncImageView=[[AsyncImageView alloc] init]; //如果有多个图片,则添加tag asyncImageView.delegate=self; asyncImageView.tag=1001; [asyncImageView loadImageFromURL:[NSURL URLWithString:[@"http://csdnimg.cn/www/images/csdnindex_logo.gif" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; } #pragma mark - AsyncImageDelegate -(void)getImageSuccess:(UIImage *)image tag:(NSNumber *)tag { NSLog(@"tag ->>%@",tag); appImageView.image=image; } -(void)getImageFail:(UIImage *)image tag:(NSNumber *)tag { //TUDO 添加默认图片 错误返回 } @end
下面是类:AsyncImageView的.h和.m文件的代码
// AsyncImageView.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "ASIFormDataRequest.h" @protocol AsyncImageDelegate <NSObject> -(void)getImageSuccess:(UIImage *)image tag:(NSNumber *)tag; -(void)getImageFail:(UIImage *)image tag:(NSNumber *)tag; @end @interface AsyncImageView : NSObject <ASIHTTPRequestDelegate>{ NSURL *urls; id<AsyncImageDelegate> delegate; int tag; } @property (nonatomic,assign) int tag; @property (nonatomic,retain) id<AsyncImageDelegate> delegate; - (void)loadImageFromURL:(NSURL*)url; //-(NSString *)GetTempPath:(NSString*)filename; -(BOOL)isExistsFile:(NSString *)filepath; -(UIImage *)getImage:(NSString*)filename; -(void)writeDataToFile:(NSString*)filename fileData:(NSData *)fileData; -(NSString *) getCacheFilePath:(NSString *)filename; @end
// AsyncImageView.m #import "AsyncImageView.h" @implementation AsyncImageView @synthesize delegate,tag; - (void)dealloc { [delegate release]; // //NSLog(@"AsyncImageView delloc"); [super dealloc]; } - (void)loadImageFromURL:(NSURL*)url { // NSLog(@"--loadImageFromURL>>%@",url); if(url!=nil&&![url isEqual:@""]) { if ([self isExistsFile:[url description]]) { //返回数据 if ([delegate respondsToSelector:@selector(getImageSuccess:tag:)]) { [delegate performSelector:@selector(getImageSuccess:tag:) withObject:[self getImage:[url description]] withObject:[NSNumber numberWithInt:self.tag]]; } }else{ urls=url; [self retain]; ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:urls] autorelease]; [request setDelegate:self]; [request startAsynchronous]; } } } -(void)requestFailed:(ASIHTTPRequest *)request { if ([delegate respondsToSelector:@selector(getImageFail:tag:)]) { [delegate performSelector:@selector(getImageFail:tag:) withObject:nil withObject:[NSNumber numberWithInt:self.tag]]; } [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; [self release]; } - (void)requestFinished:(ASIHTTPRequest *)request { NSData *responseData = [request responseData]; UIImage *image=[UIImage imageWithData:responseData]; if (image!=nil) { [self writeDataToFile:[urls description] fileData:responseData]; if ([delegate respondsToSelector:@selector(getImageSuccess:tag:)]) { [delegate performSelector:@selector(getImageSuccess:tag:) withObject:image withObject:[NSNumber numberWithInt:self.tag]]; } }else{ if ([delegate respondsToSelector:@selector(getImageFail:tag:)]) { [delegate performSelector:@selector(getImageFail:tag:) withObject:image withObject:[NSNumber numberWithInt:self.tag]]; } } [self release]; } -(BOOL)isExistsFile:(NSString *)filepath { NSFileManager *filemanage = [NSFileManager defaultManager]; NSArray *array=[filepath componentsSeparatedByString:@"//"]; NSArray *arrayName=[filepath componentsSeparatedByString:@"/"]; NSString *file=[NSString stringWithFormat:@"%@/%@",[array lastObject],[arrayName lastObject]]; return [filemanage fileExistsAtPath:[self getCacheFilePath:file]]; } -(UIImage *)getImage:(NSString*)filename { NSArray *array=[filename componentsSeparatedByString:@"//"]; NSArray *arrayName=[filename componentsSeparatedByString:@"/"]; NSString *file=[NSString stringWithFormat:@"%@/%@",[array lastObject],[arrayName lastObject]]; UIImage *image=[UIImage imageWithData:[NSData dataWithContentsOfFile:[self getCacheFilePath:file]]]; return image; } -(NSString *) getCacheFilePath:(NSString *)filename { NSArray *paths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES); NSString *path=[paths objectAtIndex:0]; NSString *filePath=[path stringByAppendingPathComponent:filename]; return filePath; } -(void)writeDataToFile:(NSString*)filename fileData:(NSData *)fileData { NSArray *array=[filename componentsSeparatedByString:@"//"]; [[NSFileManager defaultManager] createDirectoryAtPath:[self getCacheFilePath:[array lastObject]] withIntermediateDirectories:YES attributes:nil error:nil]; NSArray *arrayName=[filename componentsSeparatedByString:@"/"]; NSString *file=[NSString stringWithFormat:@"%@/%@",[array lastObject],[arrayName lastObject]]; [fileData writeToFile:[self getCacheFilePath:file] atomically:YES]; } @end