2010-08-19 9 views
1

Depuis environ un jour, j'essaie d'obtenir une cellule de tableau pour afficher un indicateur d'activité pendant le chargement d'une nouvelle vue. Sur didSelectRowAtIndexPath Je voudrais afficher l'indicateur tandis que les pistes suivantesL'indicateur d'activité d'une vue de table en charge une autre

[self.navigationController pushViewController:subKeywordController animated:YES]; 

Ce contrôleur fonctionne alors une requête SQL assez intensive

J'ai cherché sur le web et lire des dizaines de messages, mais aucun ne semble aider avec mon problème spécifique. Je comprends que je dois exécuter l'indicateur dans un autre thread parce que la poussée et la charge subséquente a préséance, mais je ne sais pas comment le faire. J'ai pensé à exécuter la requête SQL dans le contrôleur avant, mais cela devient très salissant.

La chose étrange est que j'ai utilisé MBProgressHUD pour afficher les curseurs occupés dans cette même vue de table sans problèmes. Il est seulement quand je demande une recherche, puis sélectionnez l'un des résultats qui provoque cette erreur:

bool _WebTryThreadLock (bool), 0x1d79b0: Tentatives pour obtenir le verrou web à partir d'un autre thread que le thread principal ou le fil web . Cela peut être le résultat d'un appel à UIKit à partir d'un thread secondaire. Crashing now ...

L'application continue sur l'iPhone mais bloque le simulateur.

Toute aide serait grandement appréciée.

Répondre

2

Le problème est que votre tâche dans le contrôleur tient le code de l'interface utilisateur (mais vous le savez probablement déjà!). Un moyen pas cher et facile de résoudre est de mettre un petit retard sur le démarrage de votre tâche lente (dans ce cas, votre requête SQL) à l'aide d'une minuterie:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // instead of running the SQL here, run it in a little bit 
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doSQL:) userInfo:nil repeats:NO]; 

    // Show the please wait stuff 
    [activityIndicator setHidden:NO]; 
} 

- (void)doSQL:(NSTimer *)timer { 
    // Do your sql here 
} 

L'autre façon de résoudre est de déplacer votre SQL en un fil séparé:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // instead of running the SQL here, run it in a little bit 
    [self performSelectorInBackground:@selector(doSQL) withObject:nil]; 

    // Show the please wait stuff 
    [activityIndicator setHidden:NO]; 
} 

- (void)doSQL { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Do your sql here 

    // Tell the main thread 
    [self performSelectorOnMainThread:@selector(doneSQL) userInfo:nil waitUntilDone:YES]; 

    // Cleanup 
    [pool release]; 
} 

- (void)doneSQL { 
    // Update your UI here 
} 

Hope that helps!

+0

Merci. Je venais ici pour supprimer cela car c'était une erreur stupide de ma part de ne pas appeler 'resignFirstResponder' Mais merci pour la réponse si. – Matt

Questions connexes