使BlockOperation失败,以便其他依赖项不执行

时间:2019-09-25 08:53:43

标签: swift cocoa nsoperationqueue nsblockoperation

在简单情况下,operation1依赖于operation1,但是operation2可能会失败,在这种情况下,我们不想执行operation1

是否有可能在operation1代码块内传递失败的执行?这样operation2无法完成并且let operation1 = BlockOperation { // do smth, which can fail } let operation2 = BlockOperation { } operation2.addDependency(operation1) 永远不会执行并被处置?

1[System.Boolean]
  Max[<>f__AnonymousType57

2 个答案:

答案 0 :(得分:1)

您必须手动取消从属操作。 Operation具有一个dependencies数组,其中包含取决于操作的所有操作。在operation1中检测到故障的位置,循环访问dependencies数组,并对数组中的每个操作调用cancel()

调用cancel()并不总是足以实际取消操作。常规设置是start()函数的开始检查isCancelled布尔值,如果它是true,则返回而不执行任务。因此,该操作“执行”,但未完成实际工作。如果您已覆盖start(),则必须自己进行操作。

所有这些操作都需要在isFinished设置为true之前完成。

答案 1 :(得分:0)

OperationBlockOperation的子类,它实现了cancel()函数和isCanceled属性。

如果operation1失败并想要停止operation2继续运行,它可以在第二个操作对象上调用cancel()函数。

您的代码负责检查/轮询isCanceled属性,并采取适当的措施来清理和停止您的操作。