已取消的操作仍在运行

时间:2014-07-23 03:34:38

标签: ios objective-c nsoperation nsoperationqueue

我需要取消operationqueue中的所有操作。但在调用cancellAllOperation方法后,操作仍在运行。 简单的例子:

@interface MyOperation : NSOperation
@end
@implementation MyOperation
-(void)main {
  NSLog(@"starting 1");
  sleep(4);
  NSLog(@"finished 1");
}
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
   [super viewDidLoad];
   NSOperationQueue *queue = [[NSOperationQueue alloc] init];
   MyOperation *op = [MyOperation new];
   [queue addOperation:op];
   sleep(2);
   [queue cancelAllOperations];
   NSLog(@"canceled");
}
log:
2014-07-23 09:55:48.839 MDict1[837:1303] starting 1
2014-07-23 09:55:50.842 MDict1[837:70b] canceled
2014-07-23 09:55:52.842 MDict1[837:1303] finished 1

1 个答案:

答案 0 :(得分:1)

取消操作不会唤醒sleep电话。在sleep中调用viewDidLoad是不对的。永远不要睡在主线上。

正确的解决方案是,您的操作main方法的实施需要检查self是否已被取消。如果是这样,它需要返回。

一个粗略的例子可能是:

- (void)main {
    while (!self.isCancelled) {
        // do some repeated operation
    }
}

同样,当操作被视为已取消时,操作的责任就是停止。队列实际上并没有杀死任何操作。

来自NSOperationQueue cancelAllOperations的文件(强调我的):

  

此方法向当前队列中的所有操作发送取消消息。排队操作在开始执行之前被取消。 如果操作已在执行,则由该操作识别取消并停止正在执行的操作。