2011-01-28 5 views
1

J'ai ce morceau de code:Appel méthode déléguée à partir d'un fil

- (IBAction)registerAction:(id)sender { 
[NSThread detachNewThreadSelector:@selector(registerThread) toTarget:self withObject:nil]; 
} 

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

MyDelegate *delegate = (MyDelegate *)[[UIApplication sharedApplication] delegate]; 


NSInteger locationID = [delegate.api checkCoordinate:[NSString stringWithFormat:@"%f,%f", 
      location.coordinate.latitude, location.coordinate.longitude]]; 

NSNumber *status = [api registerWithUsername:usernameField.text 
      password:passwordField.text email:emailField.text andLocation:locationID]; 

[self performSelectorOnMainThread:@selector(registrationDoneWithStatus:) withObject:[NSNumber numberWithInt:1] waitUntilDone:NO]; 
    [pool release]; 
} 

cela fonctionne bien, mais parfois je reçois cette erreur:

void _WebThreadLockFromAnyThread(bool), 0x6157e30: Obtaining the web lock from a thread other than the main thread or the web thread. UIKit should not be called from a secondary thread. 

Et il semble que seulement en utilisant le délégué Je reçois cette erreur, et je ne sais pas comment résoudre.

Merci d'avance :)

Répondre

1

Vous résoudre le problème en très soigneusement réfléchir à votre architecture de l'application et concurrency vous assurer que vous n'êtes pas l'exercice rien d'un fil qui ne devrait être fait sur le thread principal.

Dans ce cas, UIKit exécute du code à partir d'un thread secondaire. Si vous deviez définir un point d'arrêt sur _WebThreadLockFromAnyThread, vous sauriez exactement où.

Il est excessivement atypique d'utiliser le délégué de l'application à partir d'un thread secondaire dans tout sauf les circonstances les plus contrôlées.

tl; dr Vous ne pouvez pas créer une application avec un thread en détachant un nouveau thread sur un sélecteur aléatoire.

+0

Que voulez-vous dire par: "Vous ne pouvez pas faire une application enfilée en détachant un nouveau thread par rapport à un sélecteur aléatoire."? – patrick

+0

Vous ne pouvez pas prendre de méthode aléatoire et exécuter cette méthode dans un thread via 'detachNewThreadSelector: ...' et avoir l'espoir que la bonne chose se produise. Ne pas dire que c'est ce que vous avez fait ici - juste une règle générale. Le filetage est difficile. – bbum

+0

mhm, comment puis-je définir un point d'arrêt sur _WebThreadLockFromAnyThread? – patrick

3

J'ai récemment rencontré le même problème. Il peut y avoir des vues actives (par exemple, UITextField, UITextView). Essayez resignFirstResponder ces vues avant d'accéder à delegate

+0

Merci pour cela .. Cela me rendait fou. Était en train de créer une demande HTTPRequest dans un thread secondaire et continuait à recevoir ce message d'erreur. Il s'est avéré qu'un UITextField était firstResponder. Rappelez-vous, aucune de ces vues de l'interface utilisateur n'étaient accessibles dans le fil de discussion! – jyavenard

+0

vous pouvez également utiliser [UIView endEditing: (BOOL) force] pour 'rendre la vue ou toute sous-vue qui est le premier répondant à démissionner (éventuellement force)' –

Questions connexes