2010-11-18 17 views
2

J'utilise la méthode qu'Apple montre en utilisant des sous-vues dans le tableau (la plupart de ce qui est ci-dessous vient de leur documentation). Je ne fais qu'entraîner un flux rss d'environ 12 images, mais cela entraîne un défilement lent - si je me débarrasse des images, il se déplace doucement. Les images ne sont pas grandes, ce qui ne peut pas être le problème. Avant d'examiner des solutions plus complexes (traitement en arrière-plan, etc.), y a-t-il quelque chose que je puisse faire pour améliorer ce travail?Défilement saccadé avec seulement quelques images

Merci pour toute aide que vous pouvez donner à ce sujet.

#define MAINLABEL_TAG 1 
#define SECONDLABEL_TAG 2 
#define PHOTO_TAG  3 

-(UITableViewCell *)tableView : (UITableView *)tableView cellForRowAtIndexPath : (NSIndexPath *)indexPath { 
    UILabel * mainLabel, * secondLabel; 
    UIImageView * photo; 
    static NSString * CellIdentifier = @ "Cell"; 
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(100.0, 0.0, 210.0, 0.0)] autorelease]; 
     mainLabel.tag = MAINLABEL_TAG; 
     mainLabel.font = [UIFont systemFontOfSize:14.0]; 
     mainLabel.textAlignment = UITextAlignmentRight; 
     mainLabel.textColor = [UIColor blackColor]; 
     mainLabel.opaque = YES; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : mainLabel]; 

     secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(90.0, 30.0, 220.0, 0.0)] autorelease]; 
     secondLabel.tag = SECONDLABEL_TAG; 
     secondLabel.font = [UIFont systemFontOfSize:12.0]; 
     secondLabel.textAlignment = UITextAlignmentRight; 
     secondLabel.textColor = [UIColor darkGrayColor]; 
     secondLabel.opaque = YES; 
     secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : secondLabel]; 

     photo = [[[UIImageView alloc] initWithFrame:CGRectMake(30.0, 3.0, 50.0, 40.0)] autorelease]; 
     photo.tag = PHOTO_TAG; 
     photo.opaque = YES; 
     photo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : photo]; 
    } else { 
     mainLabel = (UILabel *)[cell.contentView viewWithTag : MAINLABEL_TAG]; 
     secondLabel = (UILabel *)[cell.contentView viewWithTag : SECONDLABEL_TAG]; 
     photo = (UIImageView *)[cell.contentView viewWithTag : PHOTO_TAG]; 
    } 
    // Configure the cell. 
    mainLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "title"]; 
    secondLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "teacher"]; 
    NSString * path = [[items objectAtIndex:indexPath.row] objectForKey:@ "audimage"]; 
    NSString * mypath = [path stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    NSURL * url = [NSURL URLWithString:mypath]; 
    NSData * data = [NSData dataWithContentsOfURL:url]; 
    UIImage * img = [[UIImage alloc] initWithData:data]; 
    photo.image = img; 
    return cell; 
    [cell release]; 
} 
+0

'[libération cellulaire];' ne sera jamais appelée, comme rien dans une méthode après le retour sera atteint – vikingosegundo

Répondre

1

On dirait que chaque fois que vous configurez une cellule, vous re-télécharger l'image entière à partir du Web (ou la lecture du disque dur, si c'est là vos points d'URL à):

NSData *data = [NSData dataWithContentsOfURL:url]; 
UIImage *img = [[UIImage alloc] initWithData:data]; 

C'est vraiment lent! La façon dont fonctionne UITableView consiste à réutiliser des cellules - chaque fois qu'une cellule est hors écran, elle peut être renvoyée à la méthode cellForRowAtIndexPath pour être utilisée comme cellule suivante qui devient visible.

Cela signifie que chaque temps une nouvelle cellule devient visible, vous téléchargez et créez son image.

, vous avez deux options: Au lieu de cela

  1. Téléchargez et stocker toutes les premières images (s'il n'y a que 12, il ne sera probablement pas prendre trop de mémoire).

  2. Téléchargez les images au besoin, et si vous obtenez un avertissement de mémoire, videz certaines des images mises en cache. C'est un peu plus difficile à implémenter, alors j'essayerais d'abord la première solution.

+0

Hmm..thanks..I pensait that..so il n'y a pas de mise en cache en cours avec les images de sorte qu'elles restent en mémoire lorsque l'image défile la vue? – Allen

+0

@Allen, non - parce que cette cellule qui fait défiler la vue est alors affectée à une nouvelle image, de sorte qu'elle perd son ancienne. –

+0

oh ... donc leur est maintenant le moyen de vérifier cela pour voir si elle perd l'image, alors seulement ensuite aller chercher l'image à nouveau ... comme si la photo, l'image est nulle, obtenir à nouveau l'image. Désolé si cela n'a pas de sens, juste essayer de trouver quelque chose de simple Si c'est possible) – Allen

Questions connexes