Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

фотографии SDWebImage

README Раздел говорит, как использовать его в своем приложении.

Ответ 2

Там есть хороший официальный пример здесь от Apple: LazyTableImages Я думаю, вы найдете правильный подход там....

Ответ 3

Попробуйте 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;    
}

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

Ответ 4

Я создал бесплатную библиотеку, разработанную именно для этого... HJCache. Он очень прост в использовании. iphone-image-cache

Ответ 5

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

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

Ответ 6

Вы также можете попробовать EGOImageLoading. Существует также демонстрация, в которой показано, как ее использовать.

Ответ 7

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

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

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

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

Ответ 8

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

  • Поддержка локального и кэша памяти;
  • Поддержка место держателей;
  • Поддержка касания касания (целевое действие);
  • Угол поддержки для представления изображения;

Существует также хорошая демонстрация.

Ответ 9

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


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


Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

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

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

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

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