как отменить из операции, созданной с addOperationWithBlock? - PullRequest
17 голосов
/ 11 февраля 2011

Я использую addOperationWithBlock NSOperationQueue.Как из блока проверить, должен ли я отменить операцию?Или получить доступ к любым свойствам / методам NSOperation?

[myOperationQueue addOperationWithBlock: ^{

  while ( /* long running loop */ )
  {
      // how to determine here if I need to cancel?
      // for that matter, access any NSOperation properties/methods?

  }

}];

Является ли лучший способ сделать это, используя NSBlockOperation?

Ответы [ 2 ]

50 голосов
/ 13 ноября 2011

Лучшим решением может быть использование NSBlockOperation и добавление его в очередь вместо необработанного блока. Вы можете сделать что-то вроде:

__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
  while(![operation isCancelled]){
    //Some long operation
  }
}];

[[self queue] addOperation:operation];

Это позволяет вам использовать блоки, давая вам немного больше контроля над операцией ... и еще несколько NSOperation тонкостей (например, возможность добавлять блоки завершения).

2 голосов
/ 07 июня 2011

Вы не можете проверить, нужно ли вам отменить операцию, если она в блоке.Если он находится в блоке и должен быть отменен, то он отменяется.Доступ к свойствам NSOperation не возможен, потому что блок не является экземпляром NSOperation как таковым.

Пример кода:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSOperationQueue *q = [[NSOperationQueue alloc] init];
    [q addOperationWithBlock:^{
        [NSThread sleepForTimeInterval:10];
        NSLog(@"Block 1");
    }];
    [q addOperationWithBlock:^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"Block 2");
    }];
    [q cancelAllOperations];
    [NSThread sleepForTimeInterval:15];

    [pool drain];
    return 0;
}

Если вы удалите вызов cancelAllOperations, то блоки сработают так, как вы ожидаете.

Я бы посоветовал вам, если вам нужен более точный контроль состояния отмены операции и взаимодействия с NSOperationQueue, вам лучше использовать NSOperation, а не NSBlockOperation.Для этого вы можете создать подкласс NSOperation.

...