iPhone UITableView异步加载图片 (动态加载图片)

来源:互联网 发布:北京私立汇佳学校 知乎 编辑:程序博客网 时间:2024/05/18 01:03

LazyTableImages 苹果官方的例子

//-----------方法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:self withObject: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;}