项目需求
根据图片网络地址获取图片,获取图片时若:
1. 本地存在对应的图片文件,则直接将其显示在界面
2. 本地无对应的图片文件,则请求网络图片,并将网络图片缓冲到本地的Cache文件夹下面的相应目录
实现方式
1.创建文件夹
-(NSString *) makePicDirIfNotExist {
NSArray * path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString * picDir = [[path objectAtIndex:0] stringByAppendingPathComponent:CACHE_PIC_DIR];
NSFileManager *defaultManager = [NSFileManager defaultManager];
BOOL isDir ;
if( ![defaultManager fileExistsAtPath:picDir isDirectory:&isDir]||!isDir){//如果不存在,或者不是目录
NSLog(@"图片文件夹不存在,请创建");
BOOL dirResult = [defaultManager createDirectoryAtPath:picDir withIntermediateDirectories:YES attributes:nil error:nil];
if(dirResult){
NSLog(@"文件夹创建成功!");
}
}
return picDir;
}
2.存放图片
-(void)writePic:(NSData *)picData picUrl:(NSString *)picUrl{
NSString *picDirPath = [self makePicDirIfNotExist];
NSString *picFullPath =[picDirPath stringByAppendingPathComponent: [[picUrl dataUsingEncoding:NSUTF8StringEncoding ] base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]];
if([[NSFileManager defaultManager] createFileAtPath:picFullPath contents:picData attributes:nil]){
NSLog(@"图片写入本地成功!");
}
}
3.读取本地图片
-(NSData*)getPicInPath:(NSString*)picUrl{
NSString *picDirPath = [self makePicDirIfNotExist];
NSString *picFullPath =[picDirPath stringByAppendingPathComponent: [[picUrl dataUsingEncoding:NSUTF8StringEncoding ] base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]];
if ([[NSFileManager defaultManager] fileExistsAtPath:picFullPath]) {
NSLog(@"获取到了本地的图片文件");
return [NSData dataWithContentsOfFile:picFullPath];
}
NSLog(@"本地无图片文件");
return nil;
}
4.NSThread方式获取图片
ViewBean.h
@interface ViewBean : NSObject
@property (retain) ViewController *controller;
@property (retain) UIImageView *image;
@property (retain) NSString *url;
-(void)loadImage:(NSString *)url;
-(void)showImage:(UIImage *)image;
@end
调用方式
-(void)loadImageByNSThread:( NSString *)imageUrl imageView:(UIImageView*)imageView {
ViewBean *bean = [[ViewBean alloc]init];
bean.image = imageView;
bean.url = imageUrl;
bean.controller = self;
[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:bean withObject:bean];
}
5.NSOparation方式获取图片
-(void)loadImageByNSOparation:(NSString *)imageUrl imageview:(UIImageView*)imageView{
ViewBean *bean = [[ViewBean alloc]init];
bean.image = imageView;
bean.url = imageUrl;
bean.controller = self;
NSInvocationOperation* operation = [[NSInvocationOperation alloc]initWithTarget:bean selector:@selector(loadImage:) object:imageUrl];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation];
}
6.GCD方式获取图片
-(void)loadImageByGCD:(NSString *)imageUrl imageview:(UIImageView*)imageview{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *imageData = [self getPicInPath:imageUrl];
if(!imageData){
imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
[self writePic:imageData picUrl:imageUrl];
}
UIImage *image = [UIImage imageWithData:imageData];
dispatch_async(dispatch_get_main_queue(), ^{
[imageview setImage:image];
});
});
}