2010-05-13 13 views
2

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

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

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

Shibin

+0

Дубликат: http://stackoverflow.com/questions/531482/ lazy-load-images-in-uitableviewcell – progrmr

+0

См. EGOImageLoading, http://developers.enormego.com/view/what_if_images_on_the_iphone_were_as_easy_as_html –

ответ

0
+0

Спасибо .. Я получил этот, и я добавил IconDownloader в свой проект. Но метод делегата NSURLConnection: didReceiveData не работает. поэтому решил попробовать другой путь. Не могли бы вы помочь мне в решении вопроса о делегировании? – smakstr

+0

@Shibin: это звучит как новый вопрос, используйте кнопку «Задать вопрос», чтобы создать новый вопрос, а не просить о помощи в комментарии. – progrmr

+0

Вопрос уже отправлен ... http://stackoverflow.com/questions/2824993/nsurlconnectiondelegate-connectiondidreceivedata-not-working – smakstr

3

Что я создал для проекта мои работы следующим образом; Продлить класс 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, чтобы загрузить изображение в новом фоновом потоке, изменить размер изображения и установите его на ImageView. Проверка тега добавляется, чтобы проверить, не находится ли ячейка в ожидании изображения, поскольку она может быть повторно использована, а другой поток для изображения может загружать другое изображение для этой повторно используемой ячейки ...

Функция в вышеуказанном коде с сигнатурой;

+(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; 
} 
+2

Хотя мы ценим усилия, которые вы вкладываете в этот пост, пожалуйста, не * просто * скопируйте его на каждый подходящий вопрос. Попытайтесь обработать каждый ответ на конкретный вопрос. Благодаря! – Will

0

Я использовал 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]); 
} 
Смежные вопросы