it-swarm.com.ru

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

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

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

58
ronny

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

17
TamilKing

Я бы предложил пойти на 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];
}

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

3
natanavra

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

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

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

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

2
Divine_Code

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


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


1
ShujatAli

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

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

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

1
jiachunke

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

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

0
Emon

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

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

0
vikram