ios通过按钮点击异步加载图片
比较原始的方法:
AsyncImageView.h: #import<UIKit/UIKit.h> @interfaceAsyncImageView:UIView { NSURLConnection*connection; NSMutableData*data; } -(void)loadImageFromURL:(NSURL*)url; @end AsyncImageView.m: #import"AsyncImageView.h" @implementationAsyncImageView -(id)initWithFrame:(CGRect)frame { self=[superinitWithFrame:frame]; if(self){ //Initializationcode } returnself; } -(void)loadImageFromURL:(NSURL*)url{ if(connection!=nil){[connectionrelease];} if(data!=nil){[datarelease];} NSURLRequest*request=[NSURLRequestrequestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; connection=[[NSURLConnectionalloc] initWithRequest:requestdelegate:self]; } -(void)connection:(NSURLConnection*)theConnection didReceiveData:(NSData*)incrementalData{ if(data==nil){ data= [[NSMutableDataalloc]initWithCapacity:2048]; } [dataappendData:incrementalData]; } -(void)connectionDidFinishLoading:(NSURLConnection*)theConnection{ [connectionrelease]; connection=nil; if([[selfsubviews]count]>0){ [[[selfsubviews]objectAtIndex:0]removeFromSuperview]; } UIImageView*imageView=[[[UIImageViewalloc]initWithImage:[UIImageimageWithData:data]]autorelease]; imageView.contentMode=UIViewContentModeScaleAspectFit; imageView.autoresizingMask=(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight); [selfaddSubview:imageView]; imageView.frame=self.bounds; [imageViewsetNeedsLayout]; [selfsetNeedsLayout]; [datarelease]; data=nil; } -(UIImage*)image{ UIImageView*iv=[[selfsubviews]objectAtIndex:0]; return[ivimage]; } -(void)dealloc{ [connectioncancel]; [connectionrelease]; [datarelease]; [superdealloc]; } @end
方法二:
@interfaceUIButton(AsyncImage) //sizebypoint -(void)setImageFromURL:(NSString*)urlStringadjustToSize:(CGSize)sizecompletion:(void(^)(void))completionlogo:(UIImage*)logoImage; @end @implementationUIButton(AsyncImage) -(void)setImageFromURL:(NSString*)urlStringadjustToSize:(CGSize)sizecompletion:(void(^)(void))completionlogo:(UIImage*)logoImage { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ UIImage*image=nil; NSURL*url=[NSURLURLWithString:urlString]; NSData*data=[NSDatadataWithContentsOfURL:url]; image=[UIImageimageWithData:data]; if(image){ if(!CGSizeEqualToSize(size,CGSizeZero)){ image=[UIImageimageWithCGImage:image.CGImagescale:[selfscaleImage:imageadjustToSize:size]orientation:image.imageOrientation]; } if(logoImage){ image=[selfaddLogoImage:logoImagetoImage:image]; } dispatch_async(dispatch_get_main_queue(),^{ [selfsetImage:imageforState:UIControlStateNormal]; completion(); }); } else{ NSLog(@"asyncloaderror."); } }); } //缩放图片以适应按钮大小 -(CGFloat)scaleImage:(UIImage*)imageadjustToSize:(CGSize)size { CGFloatxScale=size.width/image.size.width; CGFloatyScale=size.height/image.size.height; return1.0/MIN(xScale,yScale); } -(UIImage*)addLogoImage:(UIImage*)logotoImage:(UIImage*)img { //getimagewidthandheight CGFloatscale=[UIScreenmainScreen].scale; intw=scale*img.size.width; inth=scale*img.size.height; intlogoWidth=logo.scale*logo.size.width; intlogoHeight=logo.scale*logo.size.height; CGColorSpaceRefcolorSpace=CGColorSpaceCreateDeviceRGB(); //createagraphiccontextwithCGBitmapContextCreate CGContextRefcontext=CGBitmapContextCreate(NULL,w,h,8,4*w,colorSpace,kCGImageAlphaPremultipliedFirst); CGContextDrawImage(context,CGRectMake(0,0,w,h),img.CGImage); CGContextDrawImage(context,CGRectMake(w-logoWidth,0,logoWidth,logoHeight),[logoCGImage]); CGImageRefimageMasked=CGBitmapContextCreateImage(context); CGContextRelease(context); CGColorSpaceRelease(colorSpace); return[UIImageimageWithCGImage:imageMaskedscale:scaleorientation:img.imageOrientation]; } @end
方法三:
#import<Foundation/Foundation.h> #import"StringUtils.h" @interfaceImageManager:NSObject { NSMutableDictionary*_imageDict; NSMutableArray*_imageArr; } @property(nonatomic,strong)NSString*httpUrl; @property(nonatomic,strong)NSMutableDictionary*imageDict; @property(nonatomic,assign)dispatch_queue_tnetworkQueue; +(ImageManager*)sharedInstance; -(void)asyncImage:(NSString*)imageNameimageView:(UIImageView*)imageView; //插队 -(void)asyncImageInsert:(NSString*)imageNameimageView:(UIImageView*)imageViewinsert:(BOOL)insert; //不要在下载之前的数据 -(void)asyncImageCleanOld:(NSString*)imageNameimageView:(UIImageView*)imageViewcleanOld:(BOOL)cleanOld; @end
实现文件:
// //ImageManager.m //myb-ios // //Createdbywarriorgaoon13-6-5. //Copyright(c)2013年51myb.Allrightsreserved. // #import"ImageManager.h" @interfaceImageManager() @end @implementationImageManager //缓存图片的最大数量 staticintcounter=0; @synthesizeimageDict=_imageDict; //Singleton +(ImageManager*)sharedInstance { staticidinstance; staticdispatch_once_tonceToken; dispatch_once(&onceToken,^{ instance=self.new; }); returninstance; } -(id)init { if((self=[superinit])) { self.networkQueue=dispatch_queue_create("com.warrior.network.image",nil); _imageDict=[[NSMutableDictionaryalloc]init]; _imageArr=[[NSMutableArrayalloc]init]; } returnself; } -(NSString*)fileFullPath:(NSString*)fileName { NSString*cachePath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)objectAtIndex:0]; NSString*fileFullPath=[NSStringstringWithFormat:@"%@/%@",cachePath,fileName]; returnfileFullPath; } //不要在下载之前的数据 -(void)asyncImageCleanOld:(NSString*)imageNameimageView:(UIImageView*)imageViewcleanOld:(BOOL)cleanOld { if(cleanOld) { [_imageArrremoveAllObjects]; } [selfasyncImage:imageNameimageView:imageView]; } //插队,优先 -(void)asyncImageInsert:(NSString*)imageNameimageView:(UIImageView*)imageViewinsert:(BOOL)insert { if([StringUtilsisEmpty:imageName]){ return; } NSData*data=[NSDatadataWithContentsOfFile:[selffileFullPath:[imageNamestringByReplacingOccurrencesOfString:@"/"withString:@"-"]]]; if(data==nil){ [_imageDictsetValue:imageViewforKey:imageName]; if(insert) { [_imageArrinsertObject:imageNameatIndex:0]; } else { [_imageArraddObject:imageName]; } [selfcacheImage]; }else{ [imageViewsetImage:[UIImageimageWithData:data]]; } } //正常,附加到后面 -(void)asyncImage:(NSString*)imageNameimageView:(UIImageView*)imageView { [selfasyncImageInsert:imageNameimageView:imageViewinsert:NO]; } //异步缓存图片到本地,最多有两个线程 -(void)cacheImage { for(;counter<2&&_imageArr.count>0;counter++) { NSString*imageName=nil; @synchronized(self){ imageName=[[_imageArrobjectAtIndex:0]copy]; [_imageArrremoveObjectAtIndex:0]; } if(imageName==nil)continue; dispatch_async(self.networkQueue,^{ NSLog(@"Starting:%@",imageName); UIImage*avatarImage=nil; NSURL*url=[NSURLURLWithString:[NSStringstringWithFormat:@"%@%@",self.httpUrl,imageName]]; NSData*responseData=[NSDatadataWithContentsOfURL:url]; if(responseData.length>0) { [responseDatawriteToFile:[selffileFullPath:[imageNamestringByReplacingOccurrencesOfString:@"/"withString:@"-"]]atomically:NO]; avatarImage=[UIImageimageWithData:responseData]; NSLog(@"Finishing:%@",imageName); if(avatarImage){ dispatch_async(dispatch_get_main_queue(),^{ UIImageView*imageView=[_imageDictobjectForKey:imageName]; if(imageView!=nil&&avatarImage!=nil){ [imageViewsetImage:avatarImage]; } [_imageDictremoveObjectForKey:imageName]; [imageNamerelease]; }); } } counter--; [selfcacheImage]; }); } } @end
以上所述就是本文的全部内容了,希望大家能够喜欢。