2016-03-21 1 views
-2

J'ai une méthode dit someMethod(), je veux toujours que cette méthode soit exécutée sous thread principal. J'ai donc écrit cette méthode comme ça ..Comment confirmer qu'une méthode s'exécutera sous le thread principal dans l'objectif C?

-(void)someMethod 
{ 
    if([NSThread mainThread]) 
    { 
     // Do method stuffs 
    } 

    else 
    { 
     [self performSelectorOnMainThread:@selector(someMethod) withObject:nil waitUntilDone:YES]; 
    } 
} 

Questions:

  • Est-ce la bonne approche?
  • Si, j'appelle cette méthode par fil de fond, que se passera-t-il?

Merci

+2

utilisez [NSThread isMainThread] pour vérifier si le code ur fonctionne sur le thread principal ou non. –

Répondre

-1

Votre exemple est correct. Sur iOS, tout ce qui a trait à l'interface utilisateur doit être exécuté sur le thread principal. Si le code qui modifie l'interface utilisateur est exécuté sur un thread d'arrière-plan, le comportement n'est pas défini. Si votre code ne modifie pas l'interface utilisateur, vous pouvez l'exécuter en toute sécurité sur un thread d'arrière-plan.

1

Le "waitUntilDone: YES" est dangereux, il peut entraîner un blocage si vous ne faites pas attention. Avez-vous vraiment besoin d'attendre que la méthode soit terminée? Évitez ceci si possible. Gcd est beaucoup plus flexible; dispatch_async au thread principal fonctionnera même si vous avez une méthode va toutes sortes de paramètres, y compris les paramètres qui ne sont pas des objets.

Et si vous voulez confirmer que la méthode est appelée sur le thread principal, c'est-à-dire si l'appel sur un autre thread serait un bogue, alors vous utilisez NSAssert.

-1

Non, dans votre cas, cette méthode peut être appelée sur n'importe quel thread, et vous ne faites des choses de méthode que si c'est le thread principal. Une meilleure approche serait de toujours faire appel à la méthode sur le thread principal,

// appel à votre méthode comme celle

dispatch_async(dispatch_get_main_queue(), ^{ 
    someMethod() 
}); 

Edit: Vous pouvez également double contrôle dans la méthode elle-même que vous êtes à le thread principal

if([NSThread mainThread]) 
    { 
     // Do method stuffs 
    } 

    else 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     someMethod() 
     }); 
    }