Ленивая загрузка изображений в UITableView - PullRequest
58 голосов
/ 15 июля 2009

У меня есть около 50 пользовательских ячеек в моем UITableView. Я хочу отобразить изображение и метку в ячейках, где я получаю изображения по URL.

Я хочу выполнить ленивую загрузку изображений, чтобы пользовательский интерфейс не зависал во время загрузки изображений. Я попытался получить изображения в отдельных потоках, но мне приходится загружать каждое изображение каждый раз, когда ячейка снова становится видимой (в противном случае повторное использование ячеек показывает старые изображения). Может кто-нибудь подскажите, пожалуйста, как продублировать это поведение.

Ответы [ 8 ]

17 голосов
/ 24 октября 2013

Попробуйте AFNetworking класс скачать этот класс по этой ссылке https://github.com/AFNetworking/AFNetworking. Добавьте все классы AFNetworking в свой проект. Затем просто импортируйте эту категорию

#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview.

Затем в cellForRowAtIndexPath: поставить как показано ниже

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (cell == nil) 
    {
        cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    [cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]];
     cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row];

     cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;    
}

Это загрузит ваше изображение для imageView в UITableviewcell в асинхронном режиме. Он не будет загружаться снова и снова, пока пользователь прокручивает Tableview, потому что он также имеет кэш. Как только ваше изображение загрузится, сохраните его с помощью ключа вашего imageUrl. Я надеюсь, что это полезно для вас.

3 голосов
/ 22 декабря 2009

Я бы предложил пойти на NSOperation и делать все, что вам нужно в другом потоке.

Это класс, который я написал для загрузки изображения:

- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url {
    if(self = [super init]) {
        if(url == nil || [url isEqualToString:@""])
            return nil;
        target = trgt;
        action = sel;
        imgURL = [[NSURL alloc] initWithString: url];
    }
    return self;
}

- (void)main {
    [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
}

- (void)loadImage {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    UIImage *img = [UIImage imageNamed: @"default_user.png"];
    if(![[imgURL absoluteString] isEqualToString: @"0"]) {
        NSData *imgData = [NSData dataWithContentsOfURL: imgURL];
        img = [UIImage imageWithData: imgData];
    }
    if([target respondsToSelector: action])
        [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES];
    [pool release];
}

- (void)dealloc {
    [imgURL release];
    [super dealloc];
}

Надеюсь, это поможет!

2 голосов
/ 16 сентября 2014

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

изменить класс "кнопка изображения эго" при просмотре изображения в вашей xib ...

отложенная загрузка называется синхронным запросом ..

Эго-изображение называется асинхронным запросом. эго изображение не ждет ответа .. отобразить все изображения одновременно ..

1 голос
/ 22 июня 2014

Вы можете попробовать это lazyTableImages ,


Я настроил lazyTableImages этого проекта в очень простой ( customizeLazyTableImages ) и удалил все лишние коды с некоторыми статическими URL и заголовками, только это очень плавно загружает изображения и кэширует их


1 голос
/ 03 мая 2013

Возможно, вы можете попробовать ALImageView . Это намного проще, чем SDWebImage. Вам нужно только два исходных файла ( ALImageView.h / ALImageView.m ). представление изображения для перезагрузки различных URL в ячейке таблицы.

  1. Поддержка локального и кэш-памяти;
  2. Поддержка заполнителей;
  3. Поддержка касания касания (цель-действие);
  4. Поддержка угла для просмотра изображения;

Есть также хорошая демонстрация.

0 голосов
/ 10 июня 2016

Вы можете использовать очередь NSOperation или GCD для загрузки изображений в фоновом режиме.

Если вы не хотите загружать изображения снова и снова, вы можете использовать NSCache или файловую систему для хранения изображений.

0 голосов
/ 27 октября 2011

Я думаю, что есть другой способ решить эту проблему, если вы хотите загрузить это изображение, то в начале просмотра это означает

, когда -(void)loadView загружается, затем просто выделите эти изображения и поместите их в nsarray сейчас, когда ячейка таблицы загружается, затем сделайте ваш взгляд на ячейке таблицы и в соответствии с indexPath.row просто замените эти изображения nsarray в это представление в качестве фонового изображения или создайте подпредставление этих изображений в этом новом представлении табличной ячейки, используя индекс nsarray и indexPath.row ячейки табличного представления.

0 голосов
/ 16 июля 2009

Я не знаю ни одного встроенного способа для достижения этой цели, но, похоже, у вас уже есть что-то, работающее с другим потоком.

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

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

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

Вы можете также рассмотреть возможность размещения некоторого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...