123 votes

Vérifier si oui ou non le thread courant est le thread principal

Est-il possible de vérifier si oui ou non le thread courant est le thread principal en Objective-C?

Je veux faire quelque chose comme ça.

  - (void)someMethod
  {
    if (IS_THIS_MAIN_THREAD?) {
      NSLog(@"ok. this is main thread.");
    } else {
      NSLog(@"don't call this method from other thread!");
    }
  }

171voto

rano Points 3094

Jetez un oeil à NSTHread documentation de l'API à partir de cette page.

Il existe des méthodes comme

- (BOOL)isMainThread

+ (BOOL)isMainThread

et + (NSThread *)mainThread

7voto

T.J. Points 2711

Le schéma suivant va assurer une méthode est exécutée dans le thread principal:

- (void)yourMethod {
    // make sure this runs on the main thread 
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(yourMethod)
                               withObject:nil
                            waitUntilDone:YES];
        return;
    }
    // put your code for yourMethod here
}

-2voto

HotJard Points 393

UPD: semble ce n'est pas la bonne solution, en fonction de la file d'attente.h-tête comme mentionné @demosten

La première pensée a été apporté à moi, quand j'avais besoin de cette fonctionnalité a été la ligne:

dispatch_get_main_queue() == dispatch_get_current_queue();

Et avait cherché à la solution

[NSThread isMainThread];

J'ai décidé de comparer la méthode est plus rapide. Donc, en utilisant ce code:

BOOL b;
NSDate* start = [NSDate date];
for(int i = 0; i < 1000; ++i){
    b = dispatch_get_main_queue() == dispatch_get_current_queue();
}
NSDate* end = [NSDate date];

NSLog(@"Time 1: %f, res: %i", [end timeIntervalSinceDate:start], b);

start = [NSDate date];
for(int i = 0; i < 1000; ++i){
    b = [NSThread isMainThread];
}
end = [NSDate date];

J'avais obtenu ce message:

2013-07-14 20:47:34.030 MyApp[10032:8a0b] Time 1: 0.000050, res: 0
2013-07-14 20:47:34.058 MyApp[10032:8a0b] Time 2: 0.000123, res: 0

Donc, mine de solution à 2,5 fois plus rapide. Mais la ligne est tellement désagréable...

PS Et oui, j'avais vérifié, ça fonctionne pour tous les threads

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