Ce que j'ai créé pour un projet de travaux miniers comme suit; Étendre la classe UITableViewCell par une catégorie « UITableViewCell + Async.h » (voir quelques exemples si vous n'êtes pas sûr de ce que la chose la catégorie dans Obj C)
@interface UITableViewCell (Async)
-(void)loadAsyncImage:(NSString*)url withIndex:(NSInteger)index inWidth:(NSInteger)width inHeight:(NSInteger)height;
-(void)loadAsyncBackground:(NSMutableArray*)parameters;
@end
Et puis dans le fichier de mise en œuvre « 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 {
FootPrint
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
Cela ajoute essentiellement une fonctionnalité au UITableViewCell pour charger une image dans un nouveau thread d'arrière-plan, redimensionner l'image et le mettre à la imageview. La vérification de l'étiquette est ajoutée pour voir si la cellule attend toujours l'image, car elle peut être réutilisée et un autre thread pour l'image pourrait télécharger une autre image pour cette cellule réutilisée ...
La fonction dans le code ci-dessus avec la signature de;
+(UIImage*)getImageResized:(NSString*)url inSize:(CGSize)size;
vérifie un cache local des images, télécharge l'image à partir du Web, sinon dans le cache, il enregistre dans le cache local, redimensionne l'image de la taille et retourne l'image, tout se fait dans une synchronisation (blocage) appel de méthode. Puisque c'est déjà le thread d'arrière-plan, pas de mal à le bloquer pour cette opération. Lorsque la méthode renvoie l'image, elle est définie sur l'imageview de la cellule si elle a toujours la même balise (non réutilisée pour une autre ligne)
Dans la méthode cellForRowAtIndexPath, vous pouvez ajouter la nouvelle catégorie et vous devriez avoir terminé ;
- (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;
}