2010-05-13 4 views
2

Je dois mettre en œuvre le concept de chargement paresseux pour les images dans ma vue de table, de sorte que l'utilisateur sera fourni avec les données textuelles initialement et plus tard les images.chargement paresseux des images dans UITableView iPhone SDK

Comment puis-je mettre en œuvre ce pour mon application .. besoin d'aide .. s'il vous plaît

Merci à l'avance

Shibin

+0

double: http://stackoverflow.com/questions/531482/ lazy-load-images-in-uitableviewcell – progrmr

+0

Voir EGOImageLoading, http://developers.enormego.com/view/what_if_images_on_the_iphone_were_as_easy_as_html –

Répondre

0
+0

Merci .. J'ai eu celui-ci et j'ai ajouté le IconDownloader à mon projet. Mais la méthode de délégué NSURLConnection: didReceiveData ne fonctionne pas. donc décidé d'essayer d'une autre manière. Pouvez-vous s'il vous plaît m'aider à résoudre le problème des délégués? – smakstr

+0

@Shibin: cela ressemble à une nouvelle question, utilisez le bouton "Poser une question" pour créer une nouvelle question plutôt que de demander de l'aide dans un commentaire. – progrmr

+0

La question est déjà postée ... http://stackoverflow.com/questions/2824993/nsurlconnectiondelegate-connectiondidreceivedata-not-working – smakstr

3

Qu'est-ce que j'ai créé pour un projet de mine les travaux suivants; É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 { 
    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; 
} 
+2

Bien que nous apprécions l'effort que vous avez mis dans ce post, s'il vous plaît ne pas * simplement * le copier à chaque question appropriée. Essayez d'élaborer chaque réponse à la question spécifique. Merci! – Will

0

J'ai utilisé ASINetworkQueue pour un chargement différé.

Dans le fichier .h

#import "ASINetworkQueue.h" 

et définir une variable

//array contains url address of images and a variable of ASINetworkQueue; 
NSMutableArray *arrImg; 
ASINetworkQueue *queue; 

Dans le fichier .m

static int rowNo = 0; 
- (void)downloadImages{ 

    if(queue == nil){ 
     queue = [[[ASINetworkQueue alloc] init] autorelease]; 
    } 

    for(NSString* urlString in arrImg) 
    { 
     NSURL *url = [NSURL URLWithString:urlString]; 
     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
     [request setDelegate:self]; 
     [request setDidFinishSelector:@selector(requestDone:)]; 
     [request setDidFailSelector:@selector(requestWentWrong:)]; 
     [queue addOperation:request]; 
    } 

    [queue go]; 

} 


- (void)requestDone:(ASIHTTPRequest*)req{ 

    for (int i = 0; i < [arrImg count]; i++) { 

     NSMutableString *d = [[NSMutableString alloc] init]; 
     d = [arrImg objectAtIndex:i]; 

     //comparing the url to get correct row no of cell 
     if([[req.url absoluteString] isEqualToString:d]){ 
      rowNo = i; 
      break; 
     } 
    } 

    //creating a cell with rowNo 
    NSIndexPath *index = [NSIndexPath indexPathForRow:rowNo inSection:0]; 

    UITableViewCell *cell = (UITableViewCell *)[roomTable cellForRowAtIndexPath:index]; 

    UIImageView *v = (UIImageView *)[cell.contentView viewWithTag:10]; 

    v.image = [UIImage imageWithData:[req responseData]]; 

    [cell release]; 
    cell = nil; 
    [v release]; 
    v = nil; 
} 

- (void)requestWentWrong:(ASIHTTPRequest*)req{ 

    for (int i = 0; i < [arrImg count]; i++) { 

     NSMutableString *d = [[NSMutableString alloc] init]; 
     d = [arrImg objectAtIndex:i]; 

     //comparing the url to get correct row no of cell 
     if([[req.url absoluteString] isEqualToString:d]){ 
      rowNo = i; 
      break; 
     } 
    } 
    NSLog(@"No data for cell : %d",rowNo); 
    NSLog(@"Request returned an error %@",[req error]); 
} 
Questions connexes