Ленивая загрузка изображений в UITableView

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

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

 Abdul Yasin06 авг. 2013 г., 14:30
способ 1: использовать nsoperationqueue способ 2: блочное кодирование способ 3: библиотека
 neoneye24 июл. 2011 г., 17:23
Хотелось бы, чтобы было сравнение производительности всех этих компонентов кэширования.

Ответы на вопрос(8)

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

Support local and memory cache; Support place holders; Support tap touch(target-action); Support corner for the image view;

Также есть хорошая демка.

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

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

 26 нояб. 2013 г., 10:07
Мне нужно именно это решение. Но я не могу найти ни одного примера исходного кода. У кого-нибудь есть пример?

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

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

 04 июн. 2016 г., 08:39
Я использую это, это здорово, брат, хорошая работа, чувак.

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

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

Пытаться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. Я надеюсь, что это полезно для вас.

Я предлагаю перейти к 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];
}

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

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

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

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

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

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

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

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

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

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

Ваш ответ на вопрос