iPhone UITableView异步加载图片 (动态加载图片)
//-----------方法1----------------
//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;
}
//--------------方法2-------------
// 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:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier] autorelease];
}
[NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget:selfwithObject:indexPath];
UIFont *font = [UIFont fontWithName:@"Helvetica" size:17];
//cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
cell.textLabel.text = @"ok";
cell.textLabel.font = font;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}
- (void)updateImageForCellAtIndexPath:(NSIndexPath *)indexPath{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *image = [self getImageForCellAtIndexPath:indexPath];
if (image) {
NSLog(@"image ok %d",indexPath.row);
}
UITableViewCell *cell = [self.tbView cellForRowAtIndexPath:indexPath];
CGRect rect;
UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(KNewCollectionImageViewX+5,kTopButtonMargin, KShopCellImageViewWidth, KShopCellImageViewHeight)];
iv.tag = KImageViewTag;
iv.backgroundColor = [UIColor clearColor];
rect = iv.frame;
//iv.image = image;
[cell addSubview:iv];
//cell.imageView.image = image;
//[cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
[iv performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
[iv release];
//[image release];
[pool release];
}
-(UIImage *)getImageForCellAtIndexPath:(NSIndexPath *)indexPath{
// id path = [[dataArray objectAtIndex:indexPath.row] objectForKey:@"image"];
//id path = [imageArray objectAtIndex:indexPath.row];
//id path = @"http://merrimusings.mu.nu/archives/images/groundhog2.jpg";
NSString *path = @"http://merrimusings.mu.nu/archives/images/groundhog2.jpg";
NSURL *url = [NSURL URLWithString:path];
NSData *data = [NSData dataWithContentsOfURL:url];
//UIImage *image = [[UIImage alloc] initWithData:data cache:NO];
// NSURL *url = [NSURL URLWithString:path];
//NSData *data = [NSData dataWithContentsOfURL:url];
//UIImage *image = [[UIImage alloc] initWithData:data cache:NO];
//UIImage *image = [[UIImage alloc] initWithData:data cache:NO];
UIImage *image = [UIImage imageWithData:data];
if (image) {
NSLog(@"%@",path);
}
return image;
}
posted on 2012-02-17 10:45 pengyingh 阅读(2414) 评论(0) 编辑 收藏 举报