Как я могу скачать фотографии по порядку ячеек в UITableView с dispatch_async? - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть UITableView, в котором есть фотографии, я получаю эти фотографии из URL-адресов и использую блок для асинхронной загрузки этих фотографий, и я хочу, чтобы эти фотографии загружались по порядку ячеек в UITableView?

   // Download the images from the review of the businesses and put them into the "imageArray"
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://feature.site.com%@",entry.avatarUrl]]];
    UIImage *imageField = [[UIImage alloc] initWithData:imageData];
    dispatch_async(dispatch_get_main_queue(), ^{
        [imageArray addObject:imageField];
        photo.image = imageField;
    });
});

1 Ответ

0 голосов
/ 26 декабря 2011

Вам нужно сделать что-то вроде этого:

1) Сначала создайте и изменяемый массив, полный NSNull.

2) В CellForRowAtIndexPath спросите, равен ли массив в этом indexPath.row значению NSNull.

2.1) Если равно, загрузите изображение так:

dispatch_queue_t bgqueue = dispatch_queue_create("com.yourApp.yyourclass.bgqueue", NULL);
dispatch_async(bgqueue, ^{
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://feature.site.com%@",entry.avatarUrl]]];
    UIImage *imageField = [[UIImage alloc] initWithData:imageData];
    dispatch_async(dispatch_get_main_queue(), ^{
        [imageArray addObject:imageField atIndex:indexPath.row];
        tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]
    });
});
dispatch_release(bgqueue);

2.2) Если не равно (есть изображение), просто установите изображение в массиве.

photo.image = [imageArray objectAtIndex:indexPath.row];

При этом ваши изображения сохраняют порядок ячеек, и вы увеличиваете производительность прокрутки.

PD-1: Вы должны использовать библиотеку, которая обрабатывает загрузку и кэширование изображений, например HTTPRequest

PD-2: В своем сообщении «Сделайте reReceiveMemoryWarning» вы должны сделать что-то вроде этого:

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    [imagesArray removeAllObjects];
    //Fill the array with NSNull's again;

}

Дальнейшее улучшение:

В массиве вы можете иметь 3 состояния:

  1. NSNull: Нет изображения
  2. NewState (например, некоторая строка): загружаемое изображение.
  3. UIImage: загруженное изображение.

При этом вы можете запретить загрузку одного и того же изображения несколько раз, если во время загрузки изображений непрерывно прокручивать вверх и вниз.

...