问题描述
我有一连串的NSBlockOperation
依赖项。如果链中的一个操作失败-我希望其他操作不运行。根据文档,这应该很容易从外部进行-如果我取消某个操作,则所有相关操作都将自动取消。
但是-如果我的操作的执行块仅在执行时“知道”它失败,那么它可以cancel
进行自己的工作吗?
我尝试了以下操作:
NSBlockOperation *op = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakOpRef = op;
[takeScreenShot addExecutionBlock:^{
LOGInfo(@"Say Cheese...");
if (some_condition == NO) { // for some reason we can't take a photo
[weakOpRef cancel];
LOGError(@"Photo failed");
}
else {
// take photo,process it,etc.
LOGInfo(@"Photo taken");
}
}];
但是,当我运行此命令时,即使op
被取消了,仍然执行依赖于op
的其他操作。由于它们是相互依赖的-肯定在op
完成之前它们不会启动,并且我(在调试器中使用日志)验证了isCancelled
的{{1}}状态为op
块返回。队列仍然执行它们,就像YES
成功完成一样。
然后我进一步挑战了文档,就像这样:
op
但是很害怕在日志中看到以下输出:
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
NSBlockOperation *op = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakOpRef = takeScreenShot;
[takeScreenShot addExecutionBlock:^{
NSLog(@"Say Cheese...");
if (weakOpRef.isCancelled) { // Fail every once in a while...
NSLog(@"Photo failed");
}
else {
[NSThread sleepForTimeInterval:0.3f];
NSLog(@"Photo taken");
}
}];
NSOperation *processPhoto = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Processing Photo...");
[NSThread sleepForTimeInterval:0.1f]; // Process
NSLog(@"Processing Finished.");
}];
// setup dependencies for the operations.
[processPhoto addDependency: op];
[op cancel]; // cancelled even before dispatching!!!
[myQueue addOperation: op];
[myQueue addOperation: processPhoto];
NSLog(@">>> Operations Dispatched,Wait for processing");
[eventQueue waitUntilAllOperationsAreFinished];
NSLog(@">>> Work Finished");
请注意:被取消的操作从未运行过-尽管依赖项2020-11-05 16:18:03.803341 >>> Operations Dispatched,Wait for processing
2020-11-05 16:18:03.803427 Processing Photo...
2020-11-05 16:18:03.813557 Processing Finished.
2020-11-05 16:18:03.813638+0200 TesterApp[6887:111445] >>> Work Finished
依赖于processPhoto
,但已执行。
有想法吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)