2009-07-14 12 views
2

J'utilise le projet three20 pour mon application iPhone. J'ai réduit mon problème et je suis en train d'essayer de recréer l'exemple 'Images Web dans la table' fourni avec le projet. J'ai copié le code exactement comme dans le projet, à l'exception que je n'utilise pas le TTNavigator (ce que l'exemple fait) mais j'ajoute manuellement mon TTTableViewController à un tabBar.TTTableImageItem ne charge pas l'image avant de faire défiler

Le problème est le suivant: les images de la table doivent charger automatiquement à partir du Web, comme dans l'exemple. Mais ils ne font que charger après Je fais défiler la table de haut en bas.

Dans la console, il est clairement indiqué qu'il télécharge les images, et vous voyez l'indicateur d'activité tourner comme pour toujours .. Et à moins que je ne défile une fois vers le haut et vers le bas, les images n'apparaîtront jamais.

Quelqu'un? Merci d'avance.

PS: Si j'utilise ce code dans une UIView aléatoire, il ne fonctionne pas aussi (seulement montre un carré noir):

TTImageView* imageView = [[[TTImageView alloc] initWithFrame:CGRectMake(30, 30, 100, 100)] autorelease]; 
imageView.autoresizesToImage = YES; 
imageView.URL = @"http://webpimp.nl/logo.png"; 
[self.view addSubview:imageView]; 

Si je mets ce code dans mon AppDelegate (à droite sur la fenêtre), ça marche ... étrange?

SOLUTION POSSIBLE: Bien que je me suis arrêté à l'aide TTImageView à cet effet, je ne pense que j'ai découvert quel était le problème; threading (acceptant ainsi la réponse de Deniz Mert Edincik). Si j'ai commencé le téléchargement asynchrone (parce que fondamentalement c'est tout le TTImageView est, un téléchargement asynchrone) de n'importe où MAIS le thread principal, il ne commencerait pas. Si j'ai commencé le téléchargement sur le thread principal, il commencerait immédiatement ..

Répondre

5

Cela me semble être un problème de threading, créez-vous TTImageView dans le runloop principal?

0

Lorsqu'une image se termine, essayez de charger l'envoi d'un message reloadData à la vue de la table. Cela force la table à recalculer la taille des lignes et à redessiner la table. Faites juste attention de ne pas recommencer à télécharger l'image en réponse à ce message.

+0

TTImageView gère ce genre de chose tout seul, et devrait le faire dans cette situation. ReloadData n'est pas une option .. jamais. Même sans ce problème, appeler reloadData chaque fois qu'une image téléchargée (ce qui pourrait être beaucoup d'images) va certainement gâcher la table. – Jake

0

J'ai écrit quelque chose de semblable à ceci où une vue d'image chargera sa propre image du Web. Selon mon expérience, lorsque l'image a été chargée avec succès mais n'a pas été montrée dans sa vue, c'était un cas que la cellule a dû être dite pour redessiner. Lorsque vous faites défiler la vue de la table, les cellules sont définies pour être redessinées à l'apparition de l'écran. C'est la raison pour laquelle elles apparaissent lorsque vous faites défiler l'écran. Lorsque l'image se charge, indiquez à la cellule à laquelle elle appartient de la redessiner en lui envoyant le message setNeedsAffichage. De cette façon, lorsque l'image aura fini de télécharger, la cellule dans laquelle elle se trouve (et seulement cette cellule) se redessinera pour montrer la nouvelle image.

Il se peut que vous n'ayez pas besoin de redessiner la cellule entière et que vous puissiez vous en sortir en redessinant simplement la vue de l'image en utilisant le même appel de méthode. D'après mon expérience, la hiérarchie de ma vue de cellule a été aplatie, donc j'ai dû redessiner la cellule entière.

1

Je trouve une chose intéressante.Quand j'utilise la combinaison TTTableViewController, TTTableViewDataSource et TTModel j'ai le même problème avec le chargement de TTImageView. Mon problème était, que mon implémentation des méthodes Model 'isLoading' et 'isLoaded' ne retourne pas de valeurs correctes après l'initialisation du modèle. Cela m'oblige à appeler le rechargement manuel du modèle dans la méthode 'viewDidAppear' et cela provoque un problème de chargement d'image. Donc, je répare mes méthodes 'isLoading' et 'isLoaded' pour retourner 'NO' après Model init, et tout va bien.

0

Je n'ai pas de réponse pour ce que vous voulez à faire, mais je dirai que cela est considéré comme une fonctionnalité, et le comportement attendu. Vous utilisez TTImageView dans UITableView lorsque vous souhaitez effectuer un chargement paresseux d'images. TTImageView ne chargera que les images dont les cadres sont visibles à l'écran. De cette façon, l'appareil utilise ses ressources réseau pour télécharger les images que l'utilisateur a devant lui, plutôt qu'un tas d'images que l'utilisateur n'essaie même pas de regarder. Envisagez d'avoir une longue liste pouvant contenir quelques centaines de vignettes (comme une liste d'amis). Je sais par expérience que si vous lancez plus de 100 demandes d'images sur des appareils plus anciens, l'utilisation de la mémoire ira à travers le toit, et votre application va probablement planter. TTImageView résout ce problème.

+0

J'ai le principe du chargement paresseux, mais c'était un problème de threading. NSURLRequest ne peut effectuer que sur le thread principal. – Jake

0

Ceci est un problème de thread. Vous pouvez charger les images en incluant la ligne:

[TTURLRequestQueue mainQueue].suspended = NO; 

dans - (void)didLoadModel:(BOOL)firstTime.