NSBlockOperation是否可以在执行时取消自身,从而取消依赖的NSOperation?

问题描述

我有一连串的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 (将#修改为@)