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
|
|