您的位置:首页 > 理论基础 > 计算机网络

ios 图片的网络下载和显示(可缓存)

2013-01-24 16:38 344 查看
思路是:已存在的图片则从本地读取,本地不存在的图片则从网上下载到本地

在这里下载图片使用的是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: