- - (UITableViewCell *)tableView:(UITableView *)tableView
- cellForRowAtIndexPath:(NSIndexPath *)indexPath {
- [NSThread detachNewThreadSelector:@selector(startImageread:) toTarget:self withObject:indexPath];
- }
- startImageread是获取照片的方法,我是从本地读取的
- -(void)startImageread:(NSIndexPath *)indexPath
- {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSInteger row = [indexPath row];
- NSDictionary *imageNameDictionary = [self.DataArray objectAtIndex:[DataArray count]-row-1];
- NSString *readImageaname=[imageNameDictionary objectForKey:@"objectTimedata"];
- //NSLog(@"SaveData%@",imageNameDictionary);
- //NSLog(readImageaname);
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *documentsDirectory = [paths objectAtIndex:0];
- if (!documentsDirectory) {
- NSLog(@"Documents directory not found!");
- }
- NSString *Data2File = [documentsDirectory stringByAppendingPathComponent:readImageaname];
- UIImage *newimage=[UIImage imageWithContentsOfFile:Data2File];//读取的图片
- //UIImage *newimage=[[UIImage alloc] initWithContentsOfFile:Data2File];
- //printf("startImageread****indexPath:%d\r\n",row);
- NSDictionary *cellimage = [NSDictionary dictionaryWithObjectsAndKeys:
- indexPath, @"indexPathdtat",
- newimage,@"image",
- nil];
- //[NSThread sleepForTimeInterval:3];//不能让线程睡否则太慢了
- [self performSelectorOnMainThread:@selector(_setOCellImage:) withObject:cellimage waitUntilDone:YES];
- [pool release];
- }
- _setOCellImage是缓存刷新cell的图像
- 这里需要传递两个参数一个是indexPath 一个是图片newimage但是performSelectorOnMainThread只能带一个参数
- 这个问题困扰我半天,于是我把indexPath和newimage放到一个数组NSDictionary *cellimage传过来的
- -(void)_setOCellImage:( id )celldata
- {
- UIImage *newimage=[celldata objectForKey:@"image"];//从参数celldata里面拿出来图片
- [self.DataTable cellForRowAtIndexPath:[celldata objectForKey:@"indexPathdtat"]].imageView.image=newimage;
- }
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:selfwithObject:indexPath];
UIFont *font = [UIFont fontWithName:@"Helvetica" size:17];
//cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];