Загрузка асинхронных изображений в таблице - PullRequest
0 голосов
/ 25 июля 2011

У меня есть табличное представление, и я хочу загрузить изображение значка (100x75) в каждую строку асинхронно.До сих пор я следовал многим учебным пособиям, но не могу понять это.Как мне это сделать?

Кто-нибудь рекомендует просто сделать это с помощью стандартного API NSURLConnection, или я должен использовать один из тех классов / библиотек, которые доступны онлайн для этого?Если да, то что вы порекомендуете?

Конечно, мне нужно, чтобы он был быстрым, эффективным и не протекал.Я также не хочу, чтобы загрузка влияла на прокрутку.

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Два варианта, которые я могу придумать:

(1) Использовать ASIHTTPRequest .

(2) Пользовательская реализация, которая порождает поток, в который вы загружаете изображение, используя комбинацию NSURL / NSData. Как только изображение загружено, отправьте его методу в основном потоке пользовательского интерфейса, используя performSelectorOnMainThread:withObject:.

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];

}
0 голосов
/ 25 июля 2011

Я бы порекомендовал вам использовать 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]; 
    }
}

В любом случае вам придется много писать, чтобы все работало хорошо и быстро.

...