72 votes

iOS - Assurer l'exécution sur le thread principal

Cela fait suite à une précédente question de la mienne.

Ainsi, si tous les accès à une ressource partagée sont effectuées par le même fil conducteur, même si en mode asynchrone (déclenchée par des Api asynchrones, comme NSURLConnection délégué rappels et performSelector:withObject:afterDelay), ces accès doivent être sûrs. Droit? Ok, alors, à ce stade, ma question est: existe-t-il une règle que je peux suivre pour être sûr que mon application s'exécute mon propre code dans le thread principal?' - ce, en collaboration avec la première hypothèse, pourrait être considéré comme un bon point de départ pour la stabilité, ne pourrait-elle pas? Suffit-il de dire: 1 ne pas créer NSThread directement, 2 - n'utilisez pas de GCD, 3 ne pas utiliser NSOperation, ...?

163voto

shoughton123 Points 1970

Cela va le faire:

 [[NSOperationQueue mainQueue] addOperationWithBlock:^ {

   //Your code goes in here
   NSLog(@"Main Thread Code");

}];
 

J'espère que cela t'aides!

135voto

CarlJ Points 5080

Lorsque vous utilisez iOS> = 4

 dispatch_async(dispatch_get_main_queue(), ^{
  //Your main thread code goes in here
  NSLog(@"Im on the main thread");       
});
 

46voto

Amy Worrall Points 9975

il y a une règle que je peux suivre pour être sûr que mon application s'exécute mon propre code dans le thread principal?

En général, vous n'avez pas besoin de tout faire pour nous assurer cette - votre liste de choses est généralement suffisant. Sauf si vous êtes en interaction avec certaines API qui arrive à pondre un fil et d'exécuter votre code dans le fond, vous allez être en cours d'exécution sur le thread principal.

Si vous voulez être vraiment sûr, vous pouvez faire des choses comme

[self performSelectorOnMainThread:@selector(myMethod:) withObject:anObj waitUntilDone:YES];

pour exécuter une méthode sur le thread principal. (Il y a un PGCD équivalent).

10voto

Sean Danzeiser Points 1525

Je pense que c'est cool, même si en général sa forme permet de laisser l'appelant d'une méthode responsable de s'assurer qu'il est appelé sur le bon fil.

 if (![[NSThread currentThread] isMainThread]) {
    [self performSelector:_cmd onThread:[NSThread mainThread] withObject:someObject waitUntilDone:NO];
    return;
}
 

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