addAnnotations MKMapView exécution lente
anto1nee
Membre
Bonjour, je réalise une application qui ajoute plus de 500 annotations à la carte.
Je classe les annotations dans un NSArray puis je l'ajoute à la carte grâce à la méthode addAnnotations.
J'ai utilisé un timer pour calculer le temps d'exécution et j'ai placer des traces pendant l'exécution.
Elle dure environ 20 millisecondes, bref négligeable, le souci est que la carte se raffraichi au bout de plusieurs secondes ( 1 à plus de 10 parfois).
J'ai essayer de forcer le raffraichissement de la carte grâce aux méthodes setNeedDisplay, etcc mais rien n'y fait.
Avez-vous d'ou peuve provenir les lenteurs ?
Antoine
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je pense tout simplement qu'il y en a trop...
Il faut gérer les annotations de manière plus fine:
- Ne pas ajouter les annotations qui sont en dehors de la partie visible de la carte.
- Selon le niveau de zoom, regrouper les annotations graphiquement proches en une seule.
Utilise le profiler pour prendre tes mesures. C'est bien plus pratique que de mettre soi-même des traces dans le code. Et tu pourras vérifier si les lenteurs sont dans ton code ou dans Mapkit.
Par exemple, est-ce que ta fonction viewForAnnotation est assez rapide...
De mon côté, c'est à peu près les temps que je constate, au mieux 5 secondes pour 500 annotations sur un iPad 3 en iOS 6 (en comptant tout de même l'extraction des points dans CoreData qui prend presque la moitié du temps)
J'ai l'impression que le temps de chargement des données de la carte s'additionne au temps d'affichage des annotations, donc c'est pire quand la carte n'est pas en cache.
Tu peux essayer de les additionner par lots (de 10, 20, ou 50) plutôt qu'en un seul bloc, ça te permettra de gérer un indicateur d'activité pour réduire la la durée perçue chez l'utilisateur.
Bonjour, le problème n'est pas une question de charge car dans une autre page de mon appli je récupère de 500 à 1000 annotations en modifiant les annotations par des images, ect et tout s'affiche correctement et instantanément.
Pour être plus précis sur le soucis, ce n'est apparement pas uniquement un problème de map car les autres labels de la page sont également très long à être mis à jour. Enfet c'est tout le rendu graphique qui est bloqué.
J'ai utilisé le profiler pour visualiser les différents threads. Le main thread (celui de l'affichage) n'est pas bloqué mais il ne réalise pas les bon appel jusqu'au moment ou un autre thread a terminé son travail et uniquement à ce moment la le main thread réalise les appel de rendu graphique.
je n'ai pas réussi à trouver la solution au problème. Je l'ai donc contourner en chargeant les données plus tot dans mon application et donc réaliser les affichage dans la méthode viewdidload. Tout s'affiche correctement et instantanément.
Le réél problème est donc toujours présent.
Pendant les 10 secondes dont tu parles, la carte est-elle déjà affichée ?
Si non, essaye de faire l'ajout après l'affichage de la carte (dans un didXXXX).