[Réglé]Optimisation: UITableView + UIImage

Ben77650Ben77650 Membre
juin 2014 modifié dans API UIKit #1

Hello la communauté CocoaCafé,


 


Tout d'abord je tiens à  préciser que tout fonctionne bien à  l'heure actuelle, j'ai une UITableView, et dans chaque cellule j'ai des UILabel et d'une UIImageView. Toutes les images s'affichent correctement, à  la bonne place, chaque image correspond bien à  la bonne annonce.


 


Dans un souci d'optimisation j'aimerais régler le problème de la lenteur quand on doit scroller la UITableView. J'ai pu m'apercevoir en testant que ce souci de lenteur venait de mon image.


 


Après avoir faire plusieurs recherches sur ce forum je suis tombé sur ce post de Larme:


 




Chargement d'images + Asynchrone + UITableView




 

Je me suis donc renseigné sur le traitement asynchrone relatif à  une UIImage dans un UITableView. J'ai donc tenté de faire ça:



#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)


dispatch_async(kBgQueue, ^{
        NSString* imgLink=[[_liste objectAtIndex:indexPath.row] objectAtIndex:1];
        NSString* lienImg = [NSString stringWithFormat:@%@%@", _baseURL,imgLink];
        NSURL* urlImg = [NSURL URLWithString:[lienImg stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        if([lienImg isEqual:_baseURL])
        {
            cell.imageOffre.image=[UIImage imageNamed:@no_photo.png];
        }
        else
        {
            cell.imageOffre.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:urlImg]];
        }

    });

C'est la que je commence à  avoir des soucis, d'une part les images mettent une bonne minute à  se charger, et lors du scroll je me retrouve avec des images à  la mauvaise position (exemple: une image de fer à  lisser pour une offre de place de foot).


 


 


Je voudrait donc quelques conseils, notamment savoir est ce qu'il faut bien utiliser la manière asynchrone avec mes images pour régler ces soucis de lenteur lors du scroll s'il vous plait ?


 


PS: L'image (+ d'autres infos) est récupérée grâce à  une requête effectuée en asynchrone via



 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {


Mots clés:

Réponses

  • Problème réglé, pour ceux qui auraient le même souci, j'ai utilisé cette méthode:


     




    - (void)downloadImageWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, UIImage *image))completionBlock
    {
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [NSURLConnection sendAsynchronousRequest:request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                                   if ( !error )
                                   {
                                        UIImage *image = [[UIImage alloc] initWithData:data];
                                        completionBlock(YES,image);
                                    } else{
                                        completionBlock(NO,nil);
                                    }
                               }];
    }

  • CéroceCéroce Membre, Modérateur
    Donc, tu recharges l'image à  chaque fois que la cellule apparaà®t, même si tu l'as déjà  téléchargée...
  • Tu aurais fait ça comment toi ?


     


    La ça marche très bien, et j'ai le résultat attendu


  • AliGatorAliGator Membre, Modérateur

    Tu aurais fait ça comment toi ?

    Bah un cache tout simplement pour éviter de recharger à  chaque fois (on a déjà  donné les solutions à  gauche à  droite sur des posts existants, UIImage+AFNetworking, NSCache, tout ça)
     

    La ça marche très bien, et j'ai le résultat attendu

    Ca doit bien marcher sur ton simulateur ou sur un téléphone en wifi, mais dans la pratique bonjour la consommation mémoire et surtout réseau (et donc aussi le forfait de l'utilisateur et sa batterie).
  • Pfiou, j'ai toujours l'impression que l'attendu est bon, mais la méthode ne l'est pas ^^


Connectez-vous ou Inscrivez-vous pour répondre.