Что я создал для проекта мои работы следующим образом; Продлить класс 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;
}
Дубликат: http://stackoverflow.com/questions/531482/ lazy-load-images-in-uitableviewcell – progrmr
См. EGOImageLoading, http://developers.enormego.com/view/what_if_images_on_the_iphone_were_as_easy_as_html –