//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 {
if ((self = [super initWithFrame:frame])) {
// 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:30.0];
connection= [[NSURLConnection alloc] initWithRequest:request delegate:self];
//TODO error handling, what if connection is nil?
}
- (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];
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
- (void)dealloc {
[connection cancel];
[connection release];
[data release];
[super dealloc];
}
@end
在uitableview 中调用
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}else{
AsyncImageView* oldImage = (AsyncImageView*)[cell.contentView viewWithTag:999];
[oldImage removeFromSuperview];
}
CGRect frame;
frame.size.width=150; frame.size.height=75;
frame.origin.x=20; frame.origin.y=5;
AsyncImageView *asyncImage = [[[AsyncImageView alloc] initWithFrame:frame] autorelease];
asyncImage.tag =999;
//NSString *strUrl = [imagesArray objectAtIndex:indexPath.row]
NSString *strUrl = @"http://merrimusings.mu.nu/archives/images/groundhog2.jpg";
NSURL *url = [NSURL URLWithString:strUrl];
[asyncImage loadImageFromURL:url];
//[cell.contentView addSubview:asyncImage];
[cell addSubview:asyncImage];
//cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
cell.textLabel.text = @"ok";
cell.textLabel.font = font;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}