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
以上所述就是本文的全部内容了,希望大家能够喜欢。