123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- //
- // UIImageView+HBHttpCache.m
- // MyTest
- //
- // Created by weqia on 13-8-22.
- // Copyright (c) 2013年 weqia. All rights reserved.
- //
- #import "UIImageView+HBHttpCache.h"
- #import "UIImage+HBClass.h"
- #import "HBHttpRequestCache.h"
- @implementation UIImageView (HBHttpCache)
- static char operationKey='a';
- #pragma -mark 私有方法
- -(void)cancel
- {
- id<HBHttpOperationDelegate> operation=objc_getAssociatedObject(self, &operationKey);
- if(operation){
- [operation cancel];
- objc_setAssociatedObject(self, &operationKey, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- }
- #pragma -mark 接口方法
- -(void) setImageWithURL:(NSString*)url
- {
- [self setImageWithURL:url layout:UIImageViewLayoutNone placeholderImage:nil process:nil complete:nil option:HBHttpImageDownloaderOptionUseCache|HBHttpImageDownloaderOptionRetry];
- }
- -(void) setImageWithURL:(NSString*)url
- layout:(UIImageViewLayoutType)layout
- {
- [self setImageWithURL:url layout:layout placeholderImage:nil process:nil complete:nil option:HBHttpImageDownloaderOptionUseCache|HBHttpImageDownloaderOptionRetry];
- }
- -(void) setImageWithURL:(NSString *)url
- layout:(UIImageViewLayoutType)layout
- placeholderImage:(UIImage*)placeholderImage
- {
- [self setImageWithURL:url layout:layout placeholderImage:placeholderImage process:nil complete:nil option:HBHttpImageDownloaderOptionUseCache|HBHttpImageDownloaderOptionRetry];
- }
- -(void) setImageWithURL:(NSString *)url
- layout:(UIImageViewLayoutType)layout
- placeholderImage:(UIImage*)placeholderImage
- process:(HBHttpImageDownloaderProcessBlock) process
- complete:(HBHttpImageDownloaderCompleteBlock)complete
- {
- [self setImageWithURL:url layout:layout placeholderImage:placeholderImage process:process complete:complete option:HBHttpImageDownloaderOptionUseCache|HBHttpImageDownloaderOptionRetry];
- }
- -(void) setImageWithURL:(NSString *)url
- layout:(UIImageViewLayoutType)layout
- placeholderImage:(UIImage*)placeholderImage
- process:(HBHttpImageDownloaderProcessBlock)process
- complete:(HBHttpImageDownloaderCompleteBlock)complete
- option:(HBHttpImageDownloaderOption)option
- {
- self.image=placeholderImage;
- /****图片处理block****/
- __block void(^block)(UIImage*);
- /****图片下载block****/
- void(^download)()=^{
- [self cancel];
- [[HBHttpImageDownloader shareDownlader] downBitmapWithURL:url process:process complete:^(UIImage *image, NSData *data, NSError *error, BOOL success){
- /****回调处理****/
- if(block){
- block(image);
- }
- if(complete){
- if([NSThread isMainThread]){
- if(complete){
- complete(image,data,error,success);
- }
- }else{
- dispatch_async(dispatch_get_main_queue(), ^{
- if(complete){
- complete(image,data,error,success);
- }
- });
- }
- }
- } option:option valueReturn:^(id<HBHttpOperationDelegate> operation) {
- /****operation 注册为属性,以便于停止下载操作****/
- objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }];
- };
- __weak UIImageView * wself=self; // 防止 UIImageView 释放时, self 变成废指针
- if(layout==UIImageViewLayoutNone){
- block=^(UIImage * image){
- if(!wself) return;
- __strong UIImageView * sself=wself; // 在操作为完成之前,UIImageView 不能被释放
- /*****界面操作需放在主线程*****/
- if([NSThread isMainThread]){
- sself.image=image;
- }else{
- dispatch_async(dispatch_get_main_queue(), ^{
- sself.image=image;
- });
- }
- };
- download(); // 执行下载操作
- }else if(layout==UIImageViewLayoutLimit){
- NSMutableString * key=[NSMutableString stringWithString:url];
- [key appendFormat:@".limit"];
- block=^(UIImage * image){
- if(image){
- if(!wself) return;
- __strong UIImageView * sself=wself;
- UIImage * limitimage=[image getLimitImage:sself.frame.size];
- /*****界面操作需放在主线程*****/
- if([NSThread isMainThread]){
- CGRect frame=sself.frame;
- frame.size=limitimage.size;
- sself.frame=frame;
- sself.image=limitimage;
- }else{
- dispatch_async(dispatch_get_main_queue(), ^{
- CGRect frame=sself.frame;
- frame.size=limitimage.size;
- sself.frame=frame;
- sself.image=limitimage;
- });
- }if(option&HBHttpImageDownloaderOptionUseCache){
- /***将生成的限制大小的图片缓存起来***/
- [[HBHttpRequestCache shareCache] storeBitmap:limitimage withKey:key complete:nil];
- }
- }
- };
- /*****如果是HBHttpImageDownloaderOptionUseCache 先从缓存中加载限制大小的图片*****/
- if(option&HBHttpImageDownloaderOptionUseCache){
- [[HBHttpRequestCache shareCache] getBitmap:key complete:^(UIImage *image) {
- if(!wself) return;
- __strong UIImageView * sself=wself;
- if(image){
- CGRect frame=sself.frame;
- frame.size=image.size;
- sself.frame=frame;
- sself.image=image;
- if(complete){
- complete(image,nil,nil,YES);
- }
- }else{
- /*****如果缓存中没有,则从已缓存的原图生成,如果没有已缓存的原图,则会下载原图并生成目标图****/
- download();
- }
- }];
- }else{
- download();
- }
- }else if(layout==UIImageViewLayoutClick){
- NSMutableString * key=[NSMutableString stringWithString:url];
- [key appendFormat:@".click"];
- block=^(UIImage * image){
- if(!wself) return;
- __strong UIImageView * sself=wself;
- if(image){
- UIImage * clickimage=[image getClickImage:sself.frame.size];
- /*****界面操作需放在主线程*****/
- if([NSThread isMainThread]){
- sself.image=clickimage;
- }else{
- dispatch_async(dispatch_get_main_queue(), ^{
- sself.image=clickimage;
- });
- }if(option&HBHttpImageDownloaderOptionUseCache){
- /*****将生成的裁减过的图片缓存起来****/
- [[HBHttpRequestCache shareCache] storeBitmap:clickimage withKey:key complete:nil];
- }
- }
- };
- /*****如果是HBHttpImageDownloaderOptionUseCache 先从缓存中加载裁减过的图片*****/
- if(option&HBHttpImageDownloaderOptionUseCache){
- [[HBHttpRequestCache shareCache] getBitmap:key complete:^(UIImage *image) {
- if(!wself) return;
- __strong UIImageView * sself=wself;
- if(image){
- sself.image=image;
- if(complete){
- complete(image,nil,nil,YES);
- }
- }else{
- /*****如果缓存中没有,则从已缓存的原图生成,如果没有已缓存的原图,则会下载原图并生成目标图****/
- download();
- }
- }];
- }else{
- download();
- }
- }
- }
- -(void) setImageWithIndirectURL:(NSString *)indirectURL
- {
- [self setImageWithURL:indirectURL layout:UIImageViewLayoutNone placeholderImage:nil process:nil complete:nil option:HBHttpImageDownloaderOptionRetry|HBHttpImageDownloaderOptionUseCache];
- }
- -(void) setImageWithIndirectURL:(NSString *)indirectURL
- layout:(UIImageViewLayoutType)layout
- {
- [self setImageWithURL:indirectURL layout:layout placeholderImage:nil process:nil complete:nil option:HBHttpImageDownloaderOptionRetry|HBHttpImageDownloaderOptionUseCache];
- }
- -(void) setImageWithIndirectURL:(NSString *)indirectURL
- layout:(UIImageViewLayoutType)layout
- placeholderImage:(UIImage *)placeholderImage
- {
- [self setImageWithURL:indirectURL layout:layout placeholderImage:placeholderImage process:nil complete:nil option:HBHttpImageDownloaderOptionRetry|HBHttpImageDownloaderOptionUseCache];
- }
- -(void) setImageWithIndirectURL:(NSString *)indirectURL
- layout:(UIImageViewLayoutType)layout
- placeholderImage:(UIImage *)placeholderImage
- process:(HBHttpImageDownloaderProcessBlock)process
- complete:(HBHttpImageDownloaderCompleteBlock)complete
- {
- [self setImageWithURL:indirectURL layout:layout placeholderImage:placeholderImage process:process complete:complete option:HBHttpImageDownloaderOptionRetry|HBHttpImageDownloaderOptionUseCache];
- }
- -(void) setImageWithIndirectURL:(NSString *)indirectURL
- layout:(UIImageViewLayoutType)layout
- placeholderImage:(UIImage *)placeholderImage
- process:(HBHttpImageDownloaderProcessBlock)process
- complete:(HBHttpImageDownloaderCompleteBlock)complete
- option:(HBHttpImageDownloaderOption)option
- {
- self.image=placeholderImage;
- /****图片处理block****/
- __block void(^block)(UIImage*);
- /****图片下载block****/
- void(^download)()=^{
- [self cancel];
- [[HBHttpImageDownloader shareDownlader] downBitmapWithIndirectURL:indirectURL process:process complete:^(UIImage * image, NSData * data, NSError * error, BOOL success) {
- if(block){
- block(image);
- }
- /****回调处理****/
- if(complete){
- complete(image,data,error,success);
- }
- } option:option valueReturn:^(id<HBHttpOperationDelegate> operation) {
- /****operation 注册为属性,以便于停止下载操作****/
- objc_setAssociatedObject(self, &operationKey, operation,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }];
- };
- __weak UIImageView * wself=self; // 防止 UIImageView 释放时, self 变成废指针
- if(layout==UIImageViewLayoutNone){
- block=^(UIImage * image){
- if(!wself) return;
- __strong UIImageView * sself=wself; // 在操作为完成之前,UIImageView 不能被释放
- /*****界面操作需放在主线程*****/
- if([NSThread isMainThread]){
- sself.image=image;
- }else{
- dispatch_async(dispatch_get_main_queue(), ^{
- sself.image=image;
- });
- }
- };
- download();
- }else if(layout==UIImageViewLayoutLimit){
- NSMutableString * key=[NSMutableString stringWithString:indirectURL];
- [key appendFormat:@".limit"];
- block=^(UIImage * image){
- if(!wself) return;
- __strong UIImageView * sself=wself;
- if(image){
- UIImage * limitimage=[image getLimitImage:sself.frame.size];
- /*****界面操作需放在主线程*****/
- if([NSThread isMainThread]){
- CGRect frame=sself.frame;
- frame.size=limitimage.size;
- sself.frame=frame;
- sself.image=limitimage;
- }else{
- dispatch_async(dispatch_get_main_queue(), ^{
- CGRect frame=sself.frame;
- frame.size=limitimage.size;
- sself.frame=frame;
- sself.image=limitimage;
- });
- }if(option&HBHttpImageDownloaderOptionUseCache){
- /*****将生成的限制大小的图片缓存起来****/
- [[HBHttpRequestCache shareCache] storeBitmap:limitimage withKey:key complete:nil];
- }
- }
- };
- if(option&HBHttpImageDownloaderOptionUseCache){
- /*****先从缓存中加载限制大小的图片*****/
- [[HBHttpRequestCache shareCache] getBitmap:key complete:^(UIImage *image) {
- if(!wself) return;
- __strong UIImageView * sself=wself;
- if(image){
- CGRect frame=sself.frame;
- frame.size=image.size;
- sself.frame=frame;
- sself.image=image;
- if(complete){
- complete(image,nil,nil,YES);
- }
- }else{
- /*****如果缓存中没有,则从已缓存的原图生成,如果没有已缓存的原图,则会下载原图并生成目标图****/
- download();
- }
- }];
- }else{
- download();
- }
- }else if(layout==UIImageViewLayoutClick){
- NSMutableString * key=[NSMutableString stringWithString:indirectURL];
- [key appendFormat:@".click"];
- block=^(UIImage * image){
- if(!wself) return;
- __strong UIImageView * sself=wself;
- if(image){
- UIImage * clickimage=[image getClickImage:sself.frame.size];
- /*****界面操作需放在主线程*****/
- if([NSThread isMainThread]){
- sself.image=clickimage;
- }else{
- dispatch_async(dispatch_get_main_queue(), ^{
- sself.image=clickimage;
- });
- }if(option&HBHttpImageDownloaderOptionUseCache){
- /*****将生成的裁减过的图片缓存起来****/
- [[HBHttpRequestCache shareCache] storeBitmap:clickimage withKey:key complete:nil];
- }
- }
- };
- if(option&HBHttpImageDownloaderOptionUseCache){
- /*****先从缓存中加载裁减过的图片*****/
- [[HBHttpRequestCache shareCache] getBitmap:key complete:^(UIImage *image) {
- if(!wself) return;
- __strong UIImageView * sself=wself;
- if(image){
- sself.image=image;
- if(complete){
- complete(image,nil,nil,YES);
- }
- }else{
- /*****如果缓存中没有,则从已缓存的原图生成,如果没有已缓存的原图,则会下载原图并生成目标图****/
- download();
- }
- }];
- }else{
- download();
- }
- }
- }
- -(void) setImageWithCacheKey:(NSString *)key layout:(UIImageViewLayoutType)layout
- placeholderImage:(UIImage *)placeholderImage
- {
- NSMutableString * Key=[NSMutableString stringWithString:key];
- if(layout==UIImageViewLayoutLimit){
- [Key appendFormat:@".limit"];
- }else if(layout==UIImageViewLayoutClick){
- [Key appendFormat:@".click"];
- }
- UIImage * image=[[HBHttpRequestCache shareCache] getBitmapFromMemory:Key];
- if(image){
- self.image=image;
- if(layout==UIImageViewLayoutLimit){
- CGRect frame=self.frame;
- frame.size=image.size;
- self.frame=frame;
- }
- }else{
- self.image=placeholderImage;
- }
- }
- @end
|