UICollectionView le défilement est lent
Je viens de créer un UICollectionView
dans laquelle L'utilisateur peut ajouter des images à partir de leur téléphone à l'album photo de la fonctionnalité dans l'application. J'ai les images enregistrez-le sous-répertoire dans le répertoire documents de manière plus peuvent être ajoutés et supprimés. Cependant, quand j'ai faites défiler l'affichage de la collection, il est très lag.
Comment puis-je faire le défilement fluide et lisse?
Mon Code: Les 16 premières images prédéfinies sont des images de tout ce qui suit sont à partir d'un sous-répertoire dans le Répertoire documents de l'
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
CollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Custom" forIndexPath:indexPath];
//Current index number
int index=indexPath.section * noOfSection + indexPath.row;
//Check if its the preset photos
if(index<16){
NSString *name=[recipePhotos objectAtIndex:indexPath.section * noOfSection + indexPath.row];
cell.imageView.image=[UIImage imageNamed:name];
}
//not preset photos, so retrieve the photos the user added
else {
NSData *data= [NSData dataWithContentsOfFile:[recipePhotos objectAtIndex:index]];
UIImage *theImage=[UIImage imageWithData:data];
cell.imageView.image=theImage;
data=nil;
}
return cell;
}
Temps Profiler m'a donné ce
Running Time Self Symbol Name
568.0ms 63.1% 0.0 Main Thread 0x4048
320.0ms 35.5% 0.0 _pthread_start 0x405e
320.0ms 35.5% 0.0 thread_start
320.0ms 35.5% 0.0 _pthread_start
320.0ms 35.5% 0.0 0x1084be960
310.0ms 34.4% 1.0 0x1084be6f0
7.0ms 0.7% 0.0 mach_msg
2.0ms 0.2% 2.0 objc_msgSend
1.0ms 0.1% 1.0 -[NSAutoreleasePool release]
4.0ms 0.4% 0.0 _dispatch_mgr_thread 0x4052
4.0ms 0.4% 0.0 _dispatch_mgr_thread
4.0ms 0.4% 0.0 _dispatch_mgr_invoke
4.0ms 0.4% 4.0 kevent
3.0ms 0.3% 0.0 _dispatch_worker_thread2 0x62b24
3.0ms 0.3% 1.0 start_wqthread
3.0ms 0.3% 0.0 _dispatch_worker_thread2 0x62a84
3.0ms 0.3% 0.0 start_wqthread
3.0ms 0.3% 0.0 _pthread_wqthread
3.0ms 0.3% 0.0 _dispatch_worker_thread2
3.0ms 0.3% 0.0 _dispatch_queue_invoke
3.0ms 0.3% 0.0 _dispatch_queue_drain
3.0ms 0.3% 0.0 _dispatch_client_callout
2.0ms 0.2% 0.0 my_io_execute_passive_block
1.0ms 0.1% 0.0 __86-[NSPersistentUIManager writePublicPlistWithOpenWindowIDs:optionallyWaitingUntilDone:]_block_invoke_0835
1.0ms 0.1% 0.0 -[NSPersistentUIManager writePublicPlistData:]
1.0ms 0.1% 0.0 -[NSURL(NSURLPathUtilities) URLByAppendingPathComponent:]
1.0ms 0.1% 0.0 -[NSURL getResourceValue:forKey:error:]
1.0ms 0.1% 0.0 CFURLCopyResourcePropertyForKey
1.0ms 0.1% 0.0 __block_global_2
1.0ms 0.1% 0.0 -[NSPersistentUIManager writeRecords:withWindowInfos:flushingStaleData:]
1.0ms 0.1% 0.0 _dispatch_call_block_and_release
1.0ms 0.1% 0.0 0x1084b8580
1.0ms 0.1% 0.0 mach_msg_send
1.0ms 0.1% 0.0 mach_msg
1.0ms 0.1% 1.0 mach_msg_trap
1.0ms 0.1% 0.0 _pthread_struct_init 0x62a83
1.0ms 0.1% 0.0 start_wqthread
1.0ms 0.1% 0.0 _pthread_wqthread
1.0ms 0.1% 1.0 _pthread_struct_init
1.0ms 0.1% 0.0 start_wqthread 0x62a7f
nombre d'images dans la vue? De mon expérience, trop d'images ont tendance à ralentir la cadence jusqu'.
Il ne se produit qu'avec les cellules de charger des images à partir de l'annuaire.. découvrez mon code ci-dessus.. j'ai juste mis à jour @CodeBandits
Faites-vous faire un dessin dans
Quel est le temps de profils dans des instruments dites-vous?
Viens de faire un edit @jrturton
Il ne se produit qu'avec les cellules de charger des images à partir de l'annuaire.. découvrez mon code ci-dessus.. j'ai juste mis à jour @CodeBandits
Faites-vous faire un dessin dans
CollectionCell
?Quel est le temps de profils dans des instruments dites-vous?
Viens de faire un edit @jrturton
OriginalL'auteur Phil Scarf | 2013-05-25
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de prendre une approche comme celle que vous devez faire dans le tableviews, vous devrez réutiliser les points de vue, comme vous réutiliser les vôtres cellules dans la vue tableau.
Un très bon tutoriel est celui de Ray Wenderlich:
Dans la première partie, vous avez la base, dans le second, ils parlent de l'réutilisables point de vue, vous, regardez le lien:
http://www.raywenderlich.com/22417/beginning-uicollectionview-in-ios-6-part-22
Modifier
Exemple pour charger des images async:
Créer à votre cellulaire, une méthode
loadImageFromFile
par exemple, qui reçoit le chemin d'accès cal de cette façon:Et puis va ressembler (peut-être vous avez besoin d'adapter quelque chose ...):
Vous aurez besoin de charger l'image en arrière-plan,et une fois chargé, vous aurez besoin de mettre à jour l'image dans la cellule, sinon c'est votre parchemin attendra l'image de retour pour continuer à ralentir.
Ok, quelle est la meilleure approche à prendre soin de lui à l'arrière-plan. Aurais-je séparé de la thread principal? si oui, comment @ggrana
J'ai fait une modification de la réponse de vous donner une approche possible
Cette amélioration de la un peu, mais sa reste très lag @ggrana
OriginalL'auteur ggrana
@ggrana a la bonne idée. Chargement asynchrone aidera certainement. Cependant, vous êtes encore en train de faire le travail inutile si vous chargez à partir d'un fichier à chaque fois. Une chose à considérer serait d'augmenter le chargement asynchrone avec un
NSCache
. En gros, c'est unNSDictionary
mais n'gestion de la mémoire elle-même et les décharges de données quand il s'agit de la mémoire de la pression.Donc si vous avez la mémoire budget, vous pouvez réellement faire de votre vignettes à la volée (si vous n'avez pas à coder en dur une taille) et de les stocker dans le cache. De cette façon, vos images n'apparaît que dans la première fois. Chaque fois par la suite, ils se chargent instantanément.
Vous pouvez l'utiliser comme ceci:
cellForItem...
2) si un utilisateur fait défiler vers le bas d'une longue vue de collection très rapidement, les cellules du bas peut sembler cycle à travers une série d'images comme un tas d'appels asynchrones pour que la ré-utilisé des cellules de finalement mettre à jour l'image. À la dernière minute case de `indexPathsForVisibleCells' résout ce (en gros, "est-ce que l'indice de chemin encore visible? Si non, ne pas mettre à jour l'image).OriginalL'auteur DanBlakemore
Après quelques déconner, j'ai compris que le problème était basée sur quelques facteurs.
- Les images pour les vignettes étaient trop gros, donc je l'ai fait un autre tableau d'images avec de plus petites tailles de l'image qui correspondent à la cellule.
Deux - Avec l'aide de @ggrana, l'ouverture d'un sujet séparé, a accéléré le processus et a fait moins de lag.
De trois, je trouve aussi que le fait d'avoir un tableau d'images plutôt que de l'emplacement des images a été plus rapide-- seul problème est que cela prend plus de mémoire.
vous avez besoin de cette stackoverflow.com/a/26034382/294884 ce stackoverflow.com/a/25604378/294884
OriginalL'auteur Phil Scarf