asyncimageview慢渲染 - uitableview

时间:2012-02-15 18:01:46

标签: iphone image uitableview asynchronous cell

我有一点问题,我尝试使用AsyncImageView类将一些图像从xml文件显示到我的tableview中,我在网站上找到这个类并且它运行得很好,问题是如果我慢慢向下滚动图像几乎立即加载,如果我快速向下滚动图像需要一秒钟才能加载......这就是代码

#import "AsyncImageView.h"


@implementation AsyncImageView

- (void)dealloc {
    [connection cancel]; //in case the URL is still downloading
}


- (void)loadImageFromURL:(NSURL*)url {
     //in case we are downloading a 2nd image

    NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; //notice how delegate set to self object
}


//the URL connection calls this repeatedly as data arrives
- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData {

    if (data==nil) { data = [[NSMutableData alloc] initWithCapacity:2048]; } 

    [data appendData:incrementalData];
}

//the URL connection calls this once all the data has downloaded
- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {

    //so self data now has the complete image 
    connection=nil;

    if ([[self subviews] count]>0) {
        //then this must be another image, the old one is still in subviews
        [[[self subviews] objectAtIndex:0] removeFromSuperview]; //so remove it (releases it also)
    }

    //make an image view for the image
    UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:data]];
    imageView.contentMode = UIViewContentModeScaleAspectFit;

    [self addSubview:imageView];
    imageView.frame = self.bounds;
    [imageView setNeedsLayout];

    [self setNeedsLayout];

     //don't need this any more, its in the UIImageView now
    data=nil;
}

- (UIImage*) image {
    UIImageView* iv = [[self subviews] objectAtIndex:0];
    return [iv image];
}

@end

这是表格代码

    // 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:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    } 
    else {
        AsyncImageView* oldImage = (AsyncImageView*)
        [cell.contentView viewWithTag:999];
        [oldImage removeFromSuperview];
    }    
    elemento = [array objectAtIndex:indexPath.row];

    NSString *indirizzoImmagine = [elemento objectForKey:@"Descrizione"];

    CGRect frame;
    frame.size.width=88; 
    frame.size.height=88;
    frame.origin.x=0; 
    frame.origin.y=0;

    AsyncImageView* asyncImage = [[AsyncImageView alloc] initWithFrame:frame]; 

    asyncImage.tag = 999;
    NSURL *url = [NSURL URLWithString:indirizzoImmagine];       
    [asyncImage loadImageFromURL:url];

    cell.accessoryView = asyncImage;    

    return cell;
}

如何优化tableview?

1 个答案:

答案 0 :(得分:0)

您的网络可能无法跟上加载每张图片所需的速度。首先,我要确保您的图片很小,接近您的相框尺寸。此外,通过您加载图像的方式,以及iOS回收表格单元格的方式,您可以为已回收的单元格加载图像。如果是这种情况,只需取消oldImage引用上的负载即可。