45 votes

Quelle est la bonne façon de détecter si le code s'exécute sur le thread principal dans Objective-C? (iOS)

Mon code doit garantir une certaine opération sur le thread principal, mais les appels peuvent provenir de threads d'arrière-plan.

Afin de détecter les situations dans le fond, j'ai été en utilisant les éléments suivants:

- (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 plus tôt. Dans les versions antérieures, la fonction reçois appelée dans une boucle sans fin.

La modification de la comparaison:

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

n'a aucun effet, ils ne comparez jamais à la même valeur.

J'ai trouvé une solution qui semble fonctionner, mais je voudrais voir ce que d'autres personnes qui pensent que le premier.

96voto

bbum Points 124887

[NSThread isMainThread] et, sinon, envoyer via l'un des nombreux mécanismes au thread principal (ce que vous avez est très bien).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X