отложенная загрузка изображений в UITableView iPhone SDK - PullRequest
2 голосов
/ 13 мая 2010

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

Как я могу реализовать это в моем приложении .. нужна помощь .. пожалуйста

Заранее спасибо

Shibin

Ответы [ 3 ]

3 голосов
/ 15 августа 2011

То, что я создал для проекта шахты, работает следующим образом; Расширьте класс UITableViewCell категорией в «UITableViewCell + Async.h» (См. Несколько примеров, если вы не уверены, что такое категория в Obj C)

@interface UITableViewCell (Async)

-(void)loadAsyncImage:(NSString*)url withIndex:(NSInteger)index inWidth:(NSInteger)width inHeight:(NSInteger)height;
-(void)loadAsyncBackground:(NSMutableArray*)parameters;

@end

А затем в файле реализации "UITableViewCell + Async.m"

#import "UITableViewCell+Async.h"

@implementation UITableViewCell (Async)

-(void)loadAsyncImage:(NSString*)url 
            withIndex:(NSInteger)index 
              inWidth:(NSInteger)width 
             inHeight:(NSInteger)height {

    NSMutableArray* parameters = [NSMutableArray arrayWithCapacity:2];
    [parameters addObject:url];
    [parameters addObject:[NSNumber numberWithInteger:index]];
    [parameters addObject:[NSNumber numberWithInteger:width]];
    [parameters addObject:[NSNumber numberWithInteger:height]];

    self.imageView.tag = index;
    [self performSelectorInBackground:@selector(loadAsyncBackground:) withObject:parameters];

}

-(void)loadAsyncBackground:(NSMutableArray*)parameters {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString* url = [parameters objectAtIndex:0];
    NSInteger index = [[parameters objectAtIndex:1] integerValue];
    NSInteger width = [[parameters objectAtIndex:2] integerValue];
    NSInteger height = [[parameters objectAtIndex:3] integerValue];

    UIImage* image = [Utils getImageResized:url inSize:CGSizeMake(width, height)];

    if (self.tag==index) {
        self.imageView.image = image;
        [self setNeedsLayout];
    }

    [pool release];
}

@end

Это в основном добавляет функциональность в UITableViewCell для загрузки изображения в новый фоновый поток, изменения размера изображения и установки его в представление изображения. Добавлена ​​проверка тега, чтобы убедиться, что ячейка все еще ожидает изображение, поскольку его можно использовать повторно, и другой поток изображения может загружать другое изображение для этой повторно используемой ячейки ...

Функция в вышеприведенном коде с подписью;

+(UIImage*)getImageResized:(NSString*)url inSize:(CGSize)size;

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

В методе cellForRowAtIndexPath вы можете добавить новую категорию, и все готово;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"......."];
    if (cell == nil) {
................
    }
................
    [cell loadAsyncImage:deal.logo withIndex:indexPath.row inWidth:40 inHeight:40];
................

    return cell;
}
0 голосов
/ 28 марта 2012

Я использовал ASINetworkQueue для отложенной загрузки.

В .h файле

#import "ASINetworkQueue.h"

и определите переменную

//array contains url address of images and a variable of ASINetworkQueue;
NSMutableArray *arrImg;
ASINetworkQueue *queue;

В .m файле

static int rowNo = 0;
- (void)downloadImages{

    if(queue == nil){
        queue = [[[ASINetworkQueue alloc] init] autorelease];
    }

    for(NSString* urlString in arrImg)
    {
        NSURL *url = [NSURL URLWithString:urlString];
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setDelegate:self];
        [request setDidFinishSelector:@selector(requestDone:)];
        [request setDidFailSelector:@selector(requestWentWrong:)];
        [queue addOperation:request];
    }

    [queue go];

}


- (void)requestDone:(ASIHTTPRequest*)req{   

    for (int i = 0; i < [arrImg count]; i++) {

        NSMutableString *d = [[NSMutableString alloc] init];
        d = [arrImg objectAtIndex:i];

        //comparing the url to get correct row no of cell
        if([[req.url absoluteString] isEqualToString:d]){
            rowNo = i;
            break;
        }
    }

    //creating a cell with rowNo
    NSIndexPath *index = [NSIndexPath indexPathForRow:rowNo inSection:0];

    UITableViewCell *cell = (UITableViewCell *)[roomTable cellForRowAtIndexPath:index];

    UIImageView *v = (UIImageView *)[cell.contentView viewWithTag:10];

    v.image = [UIImage imageWithData:[req responseData]];

    [cell release];
    cell = nil;
    [v release];
    v = nil;
}

- (void)requestWentWrong:(ASIHTTPRequest*)req{

    for (int i = 0; i < [arrImg count]; i++) {

        NSMutableString *d = [[NSMutableString alloc] init];
        d = [arrImg objectAtIndex:i];

        //comparing the url to get correct row no of cell
        if([[req.url absoluteString] isEqualToString:d]){
            rowNo = i;
            break;
        }
    }
    NSLog(@"No data for cell : %d",rowNo);
    NSLog(@"Request returned an error %@",[req error]);
}
0 голосов
/ 13 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...