异步图像下载在表中

时间:2011-07-25 18:20:25

标签: iphone objective-c uitableview asynchronous nsurlconnection

我有一个表视图,我想以异步方式向每行下载一个图标图像(100x75)。到目前为止,我已经遵循了许多教程,但我似乎无法弄明白。我该怎么办?

是否有人建议使用标准NSURLConnection API执行此操作,还是应该使用其中一个可在线获取的类/库?如果是这样,你推荐什么?

当然,我需要快速,高效且不泄漏。我也不希望下载影响滚动。

谢谢!

2 个答案:

答案 0 :(得分:1)

我能想到的两个选择:

(1)使用ASIHTTPRequest

(2)一种自定义实现,它生成一个线程,您可以使用NSURL / NSData的组合加载图像。加载图像后,使用performSelectorOnMainThread:withObject:将其发送到主UI线程上的方法。

NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(loadImage:) object:nil];
[t start];
[t release];

-(void) updateImage:(id) obj {
  // do whatever you need to do
}

-(void) loadImage:(id) obj {

  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSURL *url = [NSURL URLWithString:@"imageurl"];
  NSData *imageData = [[NSData alloc]initWithContentsOfURL:url]; 
  UIImage *image = [UIImage imageWithData:imageData];
  [imageData release];

  [self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];  
  [pool release];

}

答案 1 :(得分:0)

我建议您使用ASIHTTPRequest。它简单而快速。
以下是文档的链接 - ASIHTTPRequest

修改

您只需要下载可见细胞的图像。 下面是一个样本:

- (void)loadContentForVisibleCells
{
    NSArray *cells = [self.tableView visibleCells];
    [cells retain];
    for (int i = 0; i < [cells count]; i++) 
    { 
        ...
        // Request should be here
        ...
    }
    [cells release];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
{
    if (!decelerate) 
    {
        [self loadContentForVisibleCells]; 
    }
}

无论如何,你需要编写很多代码才能让事情变得更好,更快。