让UIImageView可以直接设置网络图片url,并且支持图片缓存
2013-12-11 11:42
651 查看
我们知道UIImageView是没有这个功能的,需要用http去get到图片的data,然后用imageWithData来设置image属性
很麻烦,
下面我们就给UIImageView扩展一个方法叫做setImageWithUrl:(NSString *)url;
说道扩展,那肯定要用到类别,ok不多说,
头文件
main文件
md5扩展
头文件
main文件
util头文件
util主文件
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
相关文章推荐
- iOS多线程-SDWebImage简单介绍 1 设置imageView的图片 (内存缓存&磁盘缓存) 1 [cell.imageView sd_setImageWithURL:[NSURL URL
- tableView 获取网络图片,并且设置为圆角(优化,fps)
- iOS根据网络图片的size大小设置UIImageView的大小
- android开源项目SmartImageView设置网络图片url时抛出java.io.FileNotFoundException
- LoadImage一个从网络访问图片,并存到缓存(内存,磁盘)直接可以用
- Android Smart Image View使用方法--从url获取图片或从通讯录获取图片,支持缓存
- 利用运行时,给UIImageView写一个分类,交换里面的setImage的方法,可以重绘图片,提高内存的利用率(要是没有重绘图片,直接使用系统提供的setImag就会造成占用大量的内存问题)
- ImageView可直接调用的,根据URL设置图片的工具类
- 根据网络图片的size大小设置UIImageView的大小
- Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
- android ImageView网络图片加载、动态设置尺寸、圆角..
- (Andr 4000 oid学习)ImageView设置异步加载的网络图片
- Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
- android 加载图片轻松避免OOM(out of memory) 支持设置缓存大小,不再强制catch OOM
- 使用第三方控件GifImageView加载网络Gif图片,并且在ListView或RecycleView里面加载
- UIImageView设置UIViewContentModeScaleAspectFill 图片平铺展开
- uiimage设置网络图片
- uiimageview设置contentMode为ScaleAspectFill后显示的不是view的大小而是图片的大小了
- jquery设置背景图片:$(this).css("background-image","url(on.jpg)");就可以了
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存