我需要取消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
答案 0 :(得分:1)
取消操作不会唤醒sleep
电话。在sleep
中调用viewDidLoad
是不对的。永远不要睡在主线上。
正确的解决方案是,您的操作main
方法的实施需要检查self
是否已被取消。如果是这样,它需要返回。
一个粗略的例子可能是:
- (void)main {
while (!self.isCancelled) {
// do some repeated operation
}
}
同样,当操作被视为已取消时,操作的责任就是停止。队列实际上并没有杀死任何操作。
来自NSOperationQueue cancelAllOperations
的文件(强调我的):
此方法向当前队列中的所有操作发送取消消息。排队操作在开始执行之前被取消。 如果操作已在执行,则由该操作识别取消并停止正在执行的操作。