0

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

我试过了

 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中的所有图像(通常会一一发生..)?

4

3 回答 3

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

和在.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];

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

于 2013-03-08T09:55:02.943 回答
0

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

于 2013-03-08T09:49:49.653 回答
0

您将图像懒惰地加载到表格视图中。 是Apple的一个很好的例子。

于 2013-03-08T09:57:16.660 回答