2010-04-15 15 views
0

Je crée un MKMapView dans une méthode nommée "generateMap". De l'intérieur viewDidLoad, cela fonctionne:MKMapView ne se charge pas lorsqu'il est appelé sur un NSThread?

[self generateMap]; 

mais la carte se charger rapidement et puis disparaissent, ne laissant que la grille grise vierge:

[NSThread detachNewThreadSelector:@selector(generateMap) toTarget:self withObject:nil]; 

Toutes les idées pour lesquelles cela pourrait se passer quand je l'appelle la méthode à travers un fil?


J'ai fini par faire ceci:

-(void)viewDidLoad { 
[NSThread detachNewThreadSelector:@selector(spinTheSpinner) toTarget:self withObject:nil]; 
[self performSelectorOnMainThread:@selector(generateMap) withObject:nil waitUntilDone:NO]; 
[super viewDidLoad]; 
} 

Cela me permet d'avoir une fileuse (UIActivityIndicator) et charger les MKMapView que je veux. J'ai mis "waitUntilDone: No]" de sorte que l'écran change MapView avant qu'il ne soit fait avec generateMap. Sinon, nous ne verrons pas le spinner et ne verrons qu'un écran vide jusqu'à ce que generateMap soit terminé.

+0

Merci pour le suivi! –

Répondre

0

Je ne pense pas qu'il est conseillé d'essayer de mettre à jour l'interface utilisateur par quoi que ce soit, mais le thread principal. Que se passe-t-il lorsque vous tentez d'exécuter -generateMap sur le thread principal avec -performSelectorOnMainThread:withObject:waitUntilDone:?

Par exemple:

[self performSelectorOnMainThread:@selector(generateMap) withObject:nil waitUntilDone:YES]; 
+0

J'ai défini ... waitUntilDone: NO]; donc l'écran ne reste pas vide. – Chris

0

Tout d'abord, puis-je voir la méthode generateMap? D'autre part, d'une manière plus suffisante pour effectuer un sélecteur est en disant

 

[self performSelector:@selector(generateMap)]; 
 
+0

Ou, simplement, '[self generateMap];' –

+0

bien, les deux fonctionnent, mais je trouve ma méthode pour avoir moins d'erreurs. – Flafla2