将图像加载到tableView

时间:2013-03-08 08:53:30

标签: ios objective-c ios5 ios6 ios4

我正在使用表格视图来显示互联网上的图像以及加载图像所需的时间..

我试过

 dispatch_async(imageQueue_, ^{
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[record imageURLString]];
    dispatch_async(dispatch_get_main_queue(), ^{
        [[cell imageView] setImage:[UIImage imageWithData:imageData]];
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
    });

但是它的加载图像缓慢并重复图像,直到其他图像加载到同一行。 有没有办法同时加载tableview中的所有图像(通常会逐个加载...)?

3 个答案:

答案 0 :(得分:1)

使用AsyncImageView.h和.m

创建2个类

在AsyncImageView.h中

@interface AsyncImageView : UIView 
{
    NSURLConnection *connection;
    NSMutableData *data;
    NSString *urlString; // key for image cache dictionary
}

-(void)loadImageFromURL:(NSURL*)url;
- (void)StoreImage:(UIImage*)image String:(NSString *)str;
@end

和In .m

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) 
    {
    }
    return self;
}


- (void)drawRect:(CGRect)rect 
{
    // Drawing code
}


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

-(void)loadImageFromURL:(NSURL*)url 
{
    if (connection != nil) 
    {
        [connection cancel];
        [connection release];
        connection = nil;
    }
    if (data != nil) 
    {
        [data release];
        data = nil;
    }

    if (imageCache == nil) // lazily create image cache
        imageCache = [[ImageCache alloc] initWithMaxSize:2*1024*1024];  // 2 MB Image cache

    [urlString release];
    urlString = [[url absoluteString] copy];
    UIImage *cachedImage = [imageCache imageForKey:urlString];
    if (cachedImage != nil) {
        if ([[self subviews] count] > 0) 
        {
            [[[self subviews] objectAtIndex:0] removeFromSuperview];
        }
        UIImageView *imageView = [[[UIImageView alloc] initWithImage:cachedImage] autorelease];
        imageView.contentMode = UIViewContentModeScaleAspectFill;
        imageView.autoresizingMask = 
            UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [self addSubview:imageView];
        imageView.frame = self.bounds;
        [imageView setNeedsLayout]; // is this necessary if superview gets setNeedsLayout?
        [self setNeedsLayout];
        return;
    }

#define SPINNY_TAG 5555   

    UIActivityIndicatorView *spinny = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinny.backgroundColor=[UIColor whiteColor];
  //  spinny.tag = SPINNY_TAG;
  //  spinny.center = self.center;
    [spinny startAnimating];
    [self addSubview:spinny];
    [spinny release];

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)incrementalData 
{
    if (data==nil) 
    {
        data = [[NSMutableData alloc] initWithCapacity:2048];
    }
    [data appendData:incrementalData];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection 
{
    [connection release];
    connection = nil;

    UIView *spinny = [self viewWithTag:SPINNY_TAG];
    [spinny removeFromSuperview];
    if ([[self subviews] count] > 0) 
    {
        [[[self subviews] objectAtIndex:0] removeFromSuperview];
    }
    UIImage *image = [UIImage imageWithData:data];
    [imageCache insertImage:image withSize:[data length] forKey:urlString];
    UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self addSubview:imageView];
    imageView.frame = self.bounds;
    [imageView setNeedsLayout]; 
    [self setNeedsLayout];
    [data release];
    data = nil;
}

在您正在显示tableview的类中,只需导入AsyncImageView.h并在tableView中使用cellForRowAtIndexPath写入

    AsyncImageView *asyncImageView = nil;

    UIImageView *cellImage = (UIImageView *)[cell viewWithTag:1];
    asyncImageView = [[AsyncImageView alloc] initWithFrame:cellImage.frame] ;
    [asyncImageView loadImageFromURL:YourImageURL];
    asyncImageView.backgroundColor=[UIColor clearColor]; 
    [cell.contentView addSubview:asyncImageView];

我用过它并且工作正常。希望它对你也有用.. :)。

答案 1 :(得分:0)

正如尤金所说,使用SDWebImage。使这些东西变得如此简单。

答案 2 :(得分:0)

您可以懒惰地将图片加载到tableview。 Here是Apple的典范。