web-dev-qa-db-fra.com

Lazy charger des images dans UITableView

J'ai environ 50 cellules personnalisées dans ma UITableView. Je souhaite afficher une image et une étiquette dans les cellules où je récupère les images à partir d'URL.

Je souhaite effectuer un chargement paresseux d'images afin que l'interface utilisateur ne se fige pas pendant le chargement des images. J'ai essayé d'obtenir les images dans des threads distincts, mais je dois charger chaque image chaque fois qu'une cellule redevient visible (sinon, la réutilisation des cellules affiche les anciennes images). Quelqu'un peut-il me dire s'il vous plaît comment reproduire ce comportement.

58
ronny

Essayez la classe AFNetworking téléchargez cette classe dans ce lien https://github.com/AFNetworking/AFNetworking . Ajoutez la classe all AFNetworking à votre projet. Ensuite, importez cette catégorie. 

#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview.

Puis dans cellForRowAtIndexPath: mettre comme ci-dessous

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (cell == nil) 
    {
        cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    [cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]];
     cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row];

     cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;    
}

Cela télécharge votre image pour image dans la UITableviewcell de manière asynchrone. Il ne téléchargera pas encore et encore pendant que l'utilisateur fait défiler la table, car elle a aussi un cache. Une fois votre image téléchargée, enregistrez l'image avec la clé de votre imageUrl. J'espère que cela vous sera utile.

17
TamilKing

Je suggérerais d'aller pour une opération NSO et de faire ce que vous avez besoin sur un autre fil.

C'est une classe que j'ai écrite pour le chargement d'images:

- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url {
    if(self = [super init]) {
        if(url == nil || [url isEqualToString:@""])
            return nil;
        target = trgt;
        action = sel;
        imgURL = [[NSURL alloc] initWithString: url];
    }
    return self;
}

- (void)main {
    [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
}

- (void)loadImage {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    UIImage *img = [UIImage imageNamed: @"default_user.png"];
    if(![[imgURL absoluteString] isEqualToString: @"0"]) {
        NSData *imgData = [NSData dataWithContentsOfURL: imgURL];
        img = [UIImage imageWithData: imgData];
    }
    if([target respondsToSelector: action])
        [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES];
    [pool release];
}

- (void)dealloc {
    [imgURL release];
    [super dealloc];
}

J'espère que cela pourra aider!

3
natanavra

vous pouvez utiliser le bouton image ego ... vous pouvez télécharger les fichiers de boutons image ego à partir de github ... ajouter à votre projet ....

changer la classe "bouton image ego" à la vue image dans votre xib ...

le chargement différé est appelé demande synchrone.

l'image de l'ego s'appelle demande asynchrone. l'image de l'ego n'attend pas la réponse .. affichez toutes les images en même temps .. 

2
Divine_Code

vous pouvez essayer ceci lazyTableImages


j'avais personnalisé lazyTableImages de ce projet dans un projet très simple ( personnaliserLazyTableImages ) et supprimé tous les codes supplémentaires avec des URL et des titres statiques uniquement, ceci charge les images très facilement et les met en cache


1
ShujatAli

Vous pouvez peut-être essayer ALImageView , ce qui est beaucoup plus simple que SDWebImage.Vous n'avez besoin que de deux fichiers sources (ALImageView.h/ALImageView.m). Vous pouvez réutiliser la vue image pour recharger différentes URL une cellule tableview. 

  1. Soutenir le cache local et mémoire;
  2. Supporte les détenteurs de place;
  3. Soutien appuyez sur toucher (cible-action);
  4. Coin support pour la vue de l'image;

Il y a aussi une bonne démo.

1
jiachunke

Je pense qu’il existe un autre moyen de résoudre ce problème si vous voulez charger cette image puis, au début de la vue, cela signifie 

lorsque -(void)loadView est en cours de chargement, allouez simplement ces images et transférez-les dans une nsarray maintenant lorsque la cellule du tableau est en train de charger, puis affichez-la dans la cellule du tableau et, selon le indexPath.row, remplacez ces images de nsarray par une image de fond la sous-vue de ces images sur cette nouvelle vue de la table de commande utilisant nsarray index et indexPath.row de la cellule tableview.

0
Emon

Vous pouvez utiliser la file d'attente NSOperation ou GCD pour charger des images en arrière-plan.

Si vous ne voulez pas charger des images encore et encore, vous pouvez utiliser NSCache ou le système de fichiers pour stocker les images.

0
vikram