То, что я создал для проекта шахты, работает следующим образом;
Расширьте класс 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;
}