ios 图片的网络下载和显示(可缓存)
2013-01-24 16:38
344 查看
思路是:已存在的图片则从本地读取,本地不存在的图片则从网上下载到本地
在这里下载图片使用的是ASIHTTPRequest,
asi-http-request的使用参考:/article/8693022.html
下面是用法和自己写的一个类的代码:
现在需要使用它的类的.h文件中添加delegate,如下:
下面是类:AsyncImageView的.h和.m文件的代码
在这里下载图片使用的是ASIHTTPRequest,
asi-http-request的使用参考:/article/8693022.html
下面是用法和自己写的一个类的代码:
现在需要使用它的类的.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
相关文章推荐
- ios 从网络下载图片,保存,并用imageview从保存中显示
- ios 从网络下载图片,保存,并用imageview从保存中显示
- android ImageLoader 缓存下载显示网络图片
- ios 从网络下载图片,保存,并用imageview从保存中显示
- ios 从网络下载图片,保存,并用imageview从保存中显示
- iOS 下载缓存网络图片 SDWebImage
- 【iOS】从网络下载图片,保存,并用 UIImageView 从保存中显示
- 【ios 网络篇 3】 图片下载及缓存
- ios 从网络下载图片,保存,并用imageview从保存中显示
- ios--UIImage从网络下载、保存、显示图片
- ios 从网络下载图片,保存,并用imageview从保存中显示
- ios 从网络下载图片,保存,并用imageview从保存中显示
- ios 从网络下载图片,保存,并用imageview从保存中显示
- iOS基础8:自定义MyData/自定义SQLite用于网络判断,版本判断,图片缓存处理,下载或者上传的GET或POST请求,加密手段,.数据解析
- iOS-从网络下载图片,保存,并用imageview从保存中显示
- ios 从网络下载图片,保存,并用imageview从保存中显示
- Android:ListView异步加载图片(实现网络下载、存储本地、缓存内存、压缩显示)
- AJ学IOS(51)多线程网络之GCD下载合并图片_队列组的使用
- Android (LruCache+外部存储缓存)实现网络下载图片并缓存
- 解决ListView中在滚动时已经下载缓存的图片没有显示