iOS chargement différé des images de la table
J'ai mis en œuvre avec succès chargement différé des images dans mon application à l'aide de l'exemple fourni par apple ici. Le truc, c'est que, je veux que l'image à charger comme je suis de défilement, mais l'image est chargée dans la cellule quand j'ai fini de la faire glisser (Libération de mon doigt de l'écran. Jusqu'alors, la cellule reste vide). J'ai modifié le code comme suit:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//NSLog(@"cell for row at indexpath, size - %f, current - %d", flowTable.contentSize.height, self.current);
NSString *CellIdentifier = @"FlowCell";
MyFlowCell *cell = (MyFlowCell *)[self.flowTable dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FlowCell" owner:nil options:nil];
//cell = [nib objectAtIndex:0];
for(id currentObject in nib)
{
if([currentObject isKindOfClass:[MyFlowCell class]])
{
cell = (MyFlowCell *)currentObject;
break;
}
}
}
ImageDetails *rowItem = [self.imageData objectAtIndex:indexPath.row];
if (!rowItem.mainImage)
{
//if (self.flowTable.dragging == NO && self.flowTable.decelerating == NO)
//{
[self startIconDownload:rowItem forIndexPath:indexPath];
//}
cell.mainImage.backgroundColor = [UIColor grayColor];
}
else
{
cell.mainImage.image = rowItem.mainImage;
}
}
return cell;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (!decelerate)
{
// [self loadImagesForOnscreenRows];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//[self loadImagesForOnscreenRows];
}
En outre, j'ai découvert que dans mon ImageDownloader classe, le NSURLConnection n'a même pas recevoir la réponse jusqu'à ce que je dégage mon doigt de l'écran. J'ai essayé de savoir pourquoi ce qui se passe, mais je n'ai pas réussi jusqu'à présent. S'il vous plaît dites-moi si j'ai manqué quelque chose.
OriginalL'auteur Rameez Hussain | 2013-01-18
Vous devez vous connecter pour publier un commentaire.
Vous pouvez atteindre le chargement paresseux dans votre tableview en suivant ces étapes :
Dans votre Classe.h, mettre:
Maintenant En Classe.m fichier, mettez ce code dans la vue a la charge:
Dans cellForRowAtIndexPath:
Et pour le téléchargement de l'image de la fonction est:
Et enfin mettre ces méthodes dans votre classe:
reloadData
est un moyen inefficace de mettre à jour la cellule).Hé les gars. Merci BEAUCOUP pour toutes vos réponses. Chacun m'a aidé dans sa propre façon de résoudre le problème. J'ai surtout utilisé le concept de ce post, si. Donc, juste pour le plaisir de le faire, je vais accepter celle-ci. 🙂
OriginalL'auteur
Mise à jour de réponse:
La norme Apple LazyTableImages souffre de quelques défauts:
Il ne cherche pas à récupérer les images jusqu'à ce que le défilement fini. Je comprends pourquoi ils ont choisi de le faire (ne voulez probablement pas à récupérer les images qui pourraient être défilement loin), mais cela provoque les images apparaissent plus lentement que nécessaire.
Il ne limitent pas le nombre de requêtes simultanées pour certains, en nombre raisonnable. Oui,
NSURLConnection
sera automatiquement geler les demandes jusqu'à ce que le nombre maximal de demandes de chutes pour certains, en nombre raisonnable, mais dans le pire des cas, vous pouvez en fait avoir les demandes de temps, plutôt que de simplement les files d'attente correctement.Une fois qu'il commence à télécharger l'image, il ne sera pas l'annuler, même si la cellule par la suite défile hors de l'écran.
La solution simple est de prendre sa retraite
IconDownloader
et tous le défilement/décélération de la logique et il suffit d'utiliser laUIImageView
catégorie de soitSDWebImage
ouAFNetworking
.Si vous allez fixer vous-même, cela prend un peu de travail pour obtenir tous les de ce droit. Mais voici un aperçu de LazyTableImages qui utilise
NSOperationQueue
pour nous assurer que nous (a) limite de requêtes simultanées; et (b) permet d'annuler les demandes. J'avoue que je préfère le au-dessus deUIImageView
catégorie implémentations, mieux, mais j'ai essayé de rester avec la structure d'Apple d'origineLazyTableImages
, tout en remédiant aux défauts que j'ai énumérés ci-dessus.Liés GitHub du projet ne permet pas de résoudre l'attente de la fin de défilement. Le SDWebImage au lieu de cela.
OriginalL'auteur
En supposant que votre UITableViewCell a une url de la propriété et une UIImage propriété de l'image (en plus de la propriété ou de la valeur statique pour la file d'attente:
De la question avec votre mise en œuvre, c'est que votre image de chargement méthode est probablement produit dans le thread principal. Vous avez besoin de charger l'image en mode asynchrone et mettre à jour l'image dans le thread principal.
À corriger le bloc devriez vérifier pour voir si la réponse de l'url correspond à l'url demandée si la cellule de l'image chargée trop tard avant que la cellule a été réutilisé pour une autre image.
BTW, vous n'avez pas besoin de créer cette file d'attente des opérations. Vous pouvez simplement utiliser
[NSOperationQueue mainQueue]
comme lequeue
paramètresendAsynchronousRequest
. La demande arrive encore de façon asynchrone, mais l'achèvement de bloc sera appelée sur la file d'attente principale, éliminant ainsi la nécessité pour quedispatch_async
à la file d'attente principale. Lequeue
paramètre desendAsynchronousRequest
est la file d'attente de l'achèvement de bloc, pas pour la requête elle-même.OriginalL'auteur
Que j'ai fait cette cadre qui contient le lazy load contrôleur. Il est facile à utiliser et fonctionne hors de la boîte.
https://github.com/cloverstudio/CSUtils
Tutoriel peut être trouvé ici:
http://www.clover-studio.com/blog/using-csutils-ios-framework-for-lazy-loading-images/
OriginalL'auteur
C'est assez tard pour répondre, mais avec la version iOS changements de l'approche ne cesse de changer.
Pour paresseusement charger les images, ici c'est l'approche recommandée:
Ici - l'ensemble de la démarche est décrit dans mon tutoriel.
OriginalL'auteur