2010-07-17 5 views
0

Je développe une application iPhone avec vue de la table multiple. Sur chaque UITableview je dois charger les données de flux RSS. Chaque flux a sa propre image.Chargement d'images pour plusieurs UITableView en utilisant le chargement paresseux

Pour un seul flux, j'essaie d'analyser le fichier XML et de charger l'image dans le délégué lui-même. Est-ce que quelqu'un peut me conseiller comment implémenter le chargement paresseux pour toutes les vues de flux RSS?

Répondre

0

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; 
} 
Questions connexes