50 votes

Comment annuler NSBlockOperation

J’ai une longue boucle je veux courir à l’arrière-plan avec une `` . Je voudrais utiliser un bloc :

La question est, comment je check pour voir si elle est annulée. Le bloc ne prend pas d’arguments, et `` est nul au moment où il est capturé par le bloc. N’y a-t-il aucun moyen d’annuler les opérations de bloc ?

71voto

jemmons Points 5627

Doh. Cher futur googlers: bien sûr, operation est nul lorsqu'il est copié par le bloc, mais il ne veut pas avoir à être copié. Il peut être qualifié avec __block comme:

//THIS MIGHT LEAK! See the update below.
__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
   while( ! [operation isCancelled]){
      //do something...
   }
}];

Mise à JOUR:

Après la méditation, il me semble que cela va créer un cycle de conserver en vertu de l'ARC. Dans l'ARC, je crois, __block de stockage est conservé. Si oui, nous sommes en difficulté, parce qu' NSBlockOperation permet également de solides références au passé dans le bloc, qui a maintenant une référence forte à l'opération, qui a une forte référence au passé dans le bloc, qui...

C'est un peu moins élégant, mais l'utilisation explicite d'une référence faible, devrait rompre le cycle:

NSBlockOperation *operation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakOperation = operation;
[operation addExecutionBlock:^{
   while( ! [weakOperation isCancelled]){
      //do something...
   }
}];

Quelqu'un qui a des idées pour une solution plus élégante, s'il vous plaît commentaire!

46voto

Robert Points 10822

Pour renforcer la réponse jemmons. WWDC 2012 session 211 - bâtiment Concurent Interfaces utilisateur (33 mins dans)

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