2010-09-14 5 views
1

comment rendre ce code asynchrone ??télécharger des images asynchoronus sur l'iphone

que ce code permettent de changer l'image sur la prise en imageview mais maintenant sa lente

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSUInteger sections = [indexPath section]; 

    if (sections == 3) 
    { 
     ltxt.text = [NSString stringWithFormat:@" %d of %d", tap,[a1 count]]; 


     if(tap<[a1 count]-1) { 

      tap++; 

    NSString *sa=[a1 objectAtIndex:tap]; 

      image= [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat: sa,[a1 objectAtIndex:tap ]]]]]; 


      // NSData *imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)]; 


      myImageView.image = image; 
      //[myimg release]; 
} 

Répondre

1

cela dépend de combien d'images que vous aurez besoin de demander à tout moment donné. une bonne solution que j'ai trouvée pour la conception/demande de force industrielle était de créer un entonnoir de requête (qui a réduit le nombre d'images). ces demandes ont pris en charge l'annulation (lorsque la vue de l'image est hors écran) et ont toutes été gérées via un NSOperationQueue. il y avait une tonne de travail de thread (lire: pas pour le noob) pour le rendre transparent, mais cela fonctionnait bien pour les grandes tables qui avaient beaucoup d'images (puisque le plafond est assez bas pour le nombre d'images l'appareil iOS avec le moins de mémoire).

c'est un bon moyen, si vous avez beaucoup d'images à télécharger. sinon, alors vous pouvez regarder dans l'implémentation en utilisant performSelectorInBackground: ..., et laissez simplement l'objet effectuer son propre verrouillage/gestion. de toute façon, vous devrez faire quelque chose/afficher quelque chose pendant le téléchargement de l'image, afin que le thread appelant (généralement le thread principal) ne soit pas bloqué pendant la réception de l'image.

Q :: suivi: merci mais où dois-je déclarer cette méthode ?? à l'intérieur si (sections == 3) {} - user437503

A :: il prendra la forme `générale »:

- (void)setCellImage:(UIImage *)img { 
/* assert here if called from secondary thread */ 
    myImageView.image = img; 
} 

- (void)udpateImageFollowingTap { 
    NSAutoreleasePool * pool = [NSAutoreleasePool new]; 
    NSString * imageUrl = [self.a1 objectAtIndex:self.tap]; 
    UIImage * tmpImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]]; 
    [self performSelectorOnMainThread:@selector(setCellImage:) withObject:tmpImage]; 
    [tmpImage release]; 
    [pool release]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger sections = [indexPath section]; 
    if (sections == 3) { 
     ltxt.text = [NSString stringWithFormat:@" %d of %d", tap,[a1 count]]; 
     if(tap<[a1 count]-1) { 
      tap++; 
      /* insert code to discard previous image and display loading image indication here */ 
      [self performSelectorInBackground:@selector(udpateImageFollowingTap) withObject:0]; 
     } 
    } 
} 
+0

si vous avez besoin d'une image par événement tap/utilisateur, performSelectorInBackground puis en utilisant une méthode va être préféré. – justin

+0

merci mais où dois-je déclarer cette méthode ?? inside if (sections == 3) {} – prajakta

+0

merci mais j'obtiens cette erreur [BookDetailViewController performSelectorOnMainThread: withObject:]: sélecteur non reconnu envoyé à l'instance 0x1ab8f0 je pense [self performSelectorOnMainThread: @selector (setCellImage :) withObject: tmpImage] ; est quelque chose de mal – prajakta

Questions connexes