[ios]已取消的操作仍在运行

发布时间: 2017/3/23 21:58:30
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我需要取消 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:

取消操作不会醒过来 sleep 调用。并调用 sleepviewDidLoad 是坏。从来不睡觉的主线程上。

妥善的解决办法是,您的操作执行 main 方法需要检查如果 self 已被取消。如果是这样,它需要返回。

一个粗略的例子可能是︰

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

再次,它是操作的责任自行停止,当它看到它已被取消。队列不能杀死任何操作。

从文档 NSOperationQueue cancelAllOperations (我特别强调)︰

此方法将取消的消息发送到队列中的当前的所有操作。他们开始执行之前取消排队的操作。如果已经执行的操作,这是执行操作的识别取消和停止它在做什么。

赞助商