配色: 字号:
ios通过按钮点击异步加载图片
2016-11-04 | 阅:  转:  |  分享 
  
ios通过按钮点击异步加载图片



本文给大家汇总了几种IOS中实现异步加载图片的方法,十分的简单实用,有需要的小伙伴可以参考下。



比较原始的方法:





复制代码代码如下:





AsyncImageView.h:

#import

@interfaceAsyncImageView:UIView

{

NSURLConnectionconnection;

NSMutableDatadata;

}

-(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];}

NSURLRequestrequest=[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];

}

UIImageViewimageView=[[[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{

UIImageViewiv=[[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),^{

UIImageimage=nil;

NSURLurl=[NSURLURLWithString:urlString];

NSDatadata=[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=scaleimg.size.width;

inth=scaleimg.size.height;

intlogoWidth=logo.scalelogo.size.width;

intlogoHeight=logo.scalelogo.size.height;

CGColorSpaceRefcolorSpace=CGColorSpaceCreateDeviceRGB();

//createagraphiccontextwithCGBitmapContextCreate

CGContextRefcontext=CGBitmapContextCreate(NULL,w,h,8,4w,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#import"StringUtils.h"@interfaceImageManager:NSObject{NSMutableDictionary_imageDict;NSMutableArray_imageArr;}@property(nonatomic,strong)NSStringhttpUrl;@property(nonatomic,strong)NSMutableDictionaryimageDict;@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.www.hunanwang.network.image",nil);_imageDict=[[NSMutableDictionaryalloc]init];_imageArr=[[NSMutableArrayalloc]init];}returnself;}-(NSString)fileFullPath:(NSString)fileName{NSStringcachePath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)objectAtIndex:0];NSStringfileFullPath=[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;}NSDatadata=[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++){NSStringimageName=nil;@synchronized(self){imageName=[[_imageArrobjectAtIndex:0]copy];[_imageArrremoveObjectAtIndex:0];}if(imageName==nil)continue;dispatch_async(self.networkQueue,^{NSLog(@"Starting:%@",imageName);UIImageavatarImage=nil;NSURLurl=[NSURLURLWithString:[NSStringstringWithFormat:@"%@%@",self.www.visa158.com.httpUrl,imageName]];NSDataresponseData=[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(),^{UIImageViewimageView=[_imageDictobjectForKey:imageName];if(imageView!=nil&&avatarImage!=nil){[imageViewsetImage:avatarImage];}[_imageDictremoveObjectForKey:imageName];[imageNamerelease];});}}counter--;[selfcacheImage];});}}@end





















献花(0)
+1
(本文系白狐一梦首藏)