iOS开发之异步加载图片

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) {
        // Initialization code
    }
    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/...."]];

本文转自:http://www.istar.name/blog/ios-async-image


 

 

 

posted @ 2012-10-30 22:59  妙笔  阅读(6083)  评论(0编辑  收藏  举报