读书人

转一个UITableView中异步加载图片步骤

发布时间: 2012-08-31 12:55:03 作者: rapoo

转一个UITableView中异步加载图片方法

先说使用,再给定义

使用方法:

- (UITableViewCell *)tableView:(UITableView *)tableView
???????? cellForRowAtIndexPath:(NSIndexPath *)indexPath {
???
??? static NSString *CellIdentifier = @"ImageCell";
??? UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
???
??? if (cell == nil) {
??????? cell = [[[UITableViewCell alloc]
???????????????? initWithFrame:CGRectZero reuseIdentifier:CellIdentifier]
??????????????? autorelease];
??? } else {
??????? AsyncImageView* oldImage = (AsyncImageView*)
??????? [cell.contentView viewWithTag:999];
??????? [oldImage removeFromSuperview];
??? }
???
??? CGRect frame;
??? frame.size.width=75; frame.size.height=75;
??? frame.origin.x=0; frame.origin.y=0;
??? AsyncImageView* asyncImage = [[[AsyncImageView alloc]
?????????????????????????????????? initWithFrame:frame] autorelease];
??? asyncImage.tag = 999;
??? NSURL *url = [NSURL URLWithString: @"image url"];

??? [asyncImage loadImageFromURL:url];
??? [cell.contentView addSubview:asyncImage];

??? return cell;
}

?

类的定义:

.h

#import <UIKit/UIKit.h>


@interface AsyncImageView : UIView {
??? //could instead be a subclass of UIImageView instead of UIView, depending on what other features you want to
??? // to build into this class?
???
??? NSURLConnection* connection; //keep a reference to the connection so we can cancel download in dealloc
??? NSMutableData* data; //keep reference to the data so we can collect it as it downloads
??? //but where is the UIImage reference? We keep it in self.subviews - no need to re-code what we have in the parent class
???
}

- (void)loadImageFromURL:(NSURL*)url;
- (UIImage*) image;
@end

?

.m

?

#import "AsyncImageView.h"

@implementation AsyncImageView

- (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];
??? //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];
}

- (void)dealloc {
??? [connection cancel];
??? [connection release];
??? [data release];
??? [super dealloc];
}

@end

?

原文地址:http://www.markj.net/iphone-asynchronous-table-image/

读书人网 >移动开发

热点推荐