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

让UIImageView可以直接设置网络图片url,并且支持图片缓存

2013-12-11 11:42 651 查看
我们知道UIImageView是没有这个功能的,需要用http去get到图片的data,然后用imageWithData来设置image属性

NSMutableURLRequest *myRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:url] ];

NSData *returnData = [ NSURLConnection sendSynchronousRequest:myRequest returningResponse:nil error:nil];
UIImageView *imgview = [[UIImageView alloc] initWithImage:[UIImage imageWithData:returnData]];


很麻烦,

下面我们就给UIImageView扩展一个方法叫做setImageWithUrl:(NSString *)url;

说道扩展,那肯定要用到类别,ok不多说,

头文件

@interface UIImageView (UIImageViewWeb)
-(void)setImageWithUrl:(NSString *)url;
@end


main文件

#import "UIImageView+UIImageViewWeb.h"
#import "Util.h"
#import "NSString+md5.h"

#define  CACHE_PATH @"webcache/"

@implementation UIImageView (UIImageViewWeb)

-(void)setImageWithUrl:(NSString *)url {

if (url==nil) {
return;
}

NSString *fileCacheName = [url md5Encrypt];//这儿是个md5加密,
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *URLs = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSURL *documentsDirectory = URLs[0];
NSURL *fileCacheDirectory = [documentsDirectory URLByAppendingPathComponent:CACHE_PATH];
NSURL *fileCachePath = [fileCacheDirectory URLByAppendingPathComponent:fileCacheName];

if([fileManager fileExistsAtPath:fileCachePath.path]) {
NSData *fileCacheData = [NSData dataWithContentsOfURL:fileCachePath];
self.image = [UIImage imageWithData:fileCacheData];
} else {
[Util httpGetData:url complete:^(id result) {
self.image = [UIImage imageWithData:result];
BOOL d;
if (![fileManager fileExistsAtPath:fileCacheDirectory.path isDirectory:&d]) {
[fileManager createDirectoryAtURL:fileCacheDirectory withIntermediateDirectories:YES attributes:nil error:nil];
}
NSData *fileData = (NSData *)result;
[fileData writeToURL:fileCachePath atomically:NO];
}];
}
}
@end


md5扩展

头文件

#import <CommonCrypto/CommonDigest.h>
@interface NSString (md5)
- (NSString *)md5Encrypt;
@end


main文件

#import "NSString+md5.h"

@implementation NSString (md5)

- (NSString *)md5Encrypt {
const char *original_str = [self UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(original_str, strlen(original_str), result);
NSMutableString *hash = [NSMutableString string];
for (int i = 0; i < 16; i++)
[hash appendFormat:@"%02X", result[i]];
return [hash lowercaseString];
}
@end


util头文件

@interface Util : NSObject
+ (NSData *) httpGetData:(NSString *)url;
+ (void) httpGetData:(NSString *)url complete:(void(^)(id result))doWhat;
@end


util主文件 

+ (NSData *) httpGetData:(NSString *)url{
NSMutableURLRequest *myRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:url] ];
[myRequest setValue:[self getCookie] forHTTPHeaderField:@"Cookie"];

NSData *returnData = [ NSURLConnection sendSynchronousRequest:myRequest returningResponse:nil error:nil];
return returnData;
}
+ (void) httpGetData:(NSString *)url complete:(void(^)(id result))doWhat {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗时的操作
NSData *returnData = [Util httpGetData:url];
dispatch_async(dispatch_get_main_queue(), ^{
doWhat(returnData);
});
});
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐