2010-11-19 2 views
42

Mon code doit garantir qu'une certaine opération s'exécute sur le thread principal, mais les appels peuvent provenir des threads d'arrière-plan.Quelle est la bonne façon de détecter si le code s'exécute sur le thread principal en Objective-C? (iOS)

Pour détecter des situations dans l'arrière-plan que j'utilisais ce qui suit:

- (void)selectorToRunInMainThread:(id)arguments 
{ 
    // push to main thread 
     if ([NSRunLoop currentRunLoop] != [NSRunLoop mainRunLoop]) 
     { 
      [self performSelectorOnMainThread:@selector(selectorToRunInMainThread:) withObject:arguments waitUntilDone:NO]; 
      return; 
     } 

    /* 
    ... function content ... 
    */ 
} 

Cela fonctionne sur iOS 4 et iOS 3.2, mais pas sur iOS 3.1.3 et versions antérieures. Dans ces versions antérieures, la fonction continuera d'être appelée dans une boucle sans fin.

Changer la comparaison:

if (![[NSRunLoop currentRunLoop] isEqualTo:[NSRunLoop mainRunLoop]])

n'a pas d'effet, ils se comparent encore jamais à la même valeur.

J'ai trouvé une solution qui semble fonctionner, mais j'aimerais voir ce que les autres suggèrent en premier.

Répondre

89

[NSThread isMainThread] et, si ce n'est pas le cas, envoyer via un certain nombre de mécanismes au thread principal (ce que vous avez est bien).

+0

C'est beaucoup plus propre à lire que ce que j'avais: if ([[NSRunLoop currentRunLoop] getCFRunLoop]! = [[NSRunLoop mainRunLoop] getCFRunLoop]) –

Questions connexes