比较原始的方法:
AsyncImageView.h:
#import <UIKit/UIKit.h> @interface AsyncImageView : UIView { NSURLConnection* connection; NSMutableData* data; } - ( void )loadImageFromURL:(NSURL*)url; @end |
AsyncImageView.m:
#import "AsyncImageView.h" @implementation AsyncImageView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { } return self; } - ( void )loadImageFromURL:(NSURL*)url { if (connection!=nil) { [connection release]; } if (data!=nil) { [data release]; } NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; } - ( void )connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData { if (data==nil) { data = [[NSMutableData alloc] initWithCapacity:2048]; } [data appendData:incrementalData]; } - ( void )connectionDidFinishLoading:(NSURLConnection*)theConnection { [connection release]; connection=nil; if ([[self subviews] count] > 0) { [[[self subviews] objectAtIndex:0] removeFromSuperview]; } UIImageView *imageView = [[[UIImageView alloc] initWithImage:[UIImage imageWithData:data]] autorelease]; imageView.contentMode = UIViewContentModeScaleAspectFit; imageView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ); [self addSubview:imageView]; imageView.frame = self.bounds; [imageView setNeedsLayout]; [self setNeedsLayout]; [data release]; data=nil; } - (UIImage*) image { UIImageView* iv = [[self subviews] objectAtIndex:0]; return [iv image]; } - ( void )dealloc { [connection cancel]; [connection release]; [data release]; [super dealloc]; } @end |
使用:
AsyncImageView *asyncImage = [[AsyncImageView alloc] init]; asyncImage.frame = CGRectMake(100, point_y, 95, 95) [asyncImage.layer setMasksToBounds:YES]; [asyncImage.layer setCornerRadius:15]; [asyncImage loadImageFromURL:[NSURL URLWithString:@ "www.istar.name/...." ]]; |
不过发现一个好东东, SDWebImage, 这个实在是太方便了
主页:https://github.com/rs/SDWebImage
1.下载下来放到project里面
2. 添加:MapKit.framework
3. #import “UIImageView+WebCache.h”
4. 使用:
UIImageView *asyncImage = [[UIImageView alloc] init]; [asyncImage setImageWithURL:[NSURL URLWithString:@ www.istar.name/.... ]]; |
使用第三方库
EGOImageLoading是我在项目中用的比较多的一个第三方图片异步加载类,你们可以在git上找到并下载它,链接如下。另外提一下,
广为人知的下拉刷新EGORefreshTableHeaderView也是就是这个人写的。
https://github.com/enormego/EGOImageLoading
(下载后运行demo程序XCode会提示找不到EGOCache.h头文件,可以在这个地方下载https://github.com/enormego/EGOCache)
使用方法可以参照里面的demo程序,很简单,只要把ImageUrl告诉它,剩下的就什么都不用管了,它会帮你异步加载,还会做缓存处理...
?1234 // 设置默认占位图片 myEgoimageView.placeholderImage = [UIImage imageNamed:@"placeholder.png"]; // 告诉它图片的url地址, done myEgoimageView.imageURL = [NSURL URLWithString:@"http://simg.cocoachina.com/201111220746561330.jpg"];