如何取消NSOperation的依赖项?

Mat*_*ick 10 asynchronous nsoperation nsoperationqueue ios

NSOperation在依赖图中有一些s:

NSOperation *op1 = ...;
NSOperation *op2 = ...;

[op2 addDependency:op1];
Run Code Online (Sandbox Code Playgroud)

这是我如何运行它们:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op1];
[queue addOperation:op2];
Run Code Online (Sandbox Code Playgroud)

现在我需要取消它们.如何确保NSOperation依赖关系图中的所有s都被取消,并且没有其他NSOperations被取消?


我尝试过的:

打电话cancel给任何一方NSOperation并不取消另一方(据我所知):

[op1 cancel]; // doesn't cancel op2
// -- or --
[op2 cancel]; // doesn't cancel op1
Run Code Online (Sandbox Code Playgroud)

取消队列也将取消不属于的依赖图的部分的操作op1op2(如果有在队列中的任何这样的操作):

[queue cancelAllOperations];
Run Code Online (Sandbox Code Playgroud)

所以我使用自定义方法解决了这个问题,该方法以递归方式查看NSOperation依赖关系并取消它们.但是,我对这个解决方案不满意,因为我觉得我正在与框架作斗争:

- (void)recursiveCancel:(NSOperation *)op
{
    [op cancel];
    for (NSOperation *dep in op.dependencies)
    {
        [self recursiveCancel:op];
    }
}
Run Code Online (Sandbox Code Playgroud)

Ian*_*ald 10

不存在NSOperation自动取消其依赖关系的概念.这是因为多个NSOperations可能依赖于同一个s NSOperation.依赖关系严格存在以延迟特定的执行,NSOperation直到其所有依赖关系NSOperation完成.

您可以考虑编写以下子类NSOperation:

@interface NSOperationOneToOne : NSOperation
- (void)addOneToOneDependency:(NSOperation *)operation;
- (void)removeOneToOneDependency:(NSOperation *)operation;
@end

@implementation NSOperationOneToOne {
  NSMutableArray *oneToOneDependencies;
}
- (void)addOneToOneDependency:(NSOperation *)operation {
  [oneToOneDependencies addObject:operation];
  [self addDependency:operation];
}
- (void)removeOneToOneDependency:(NSOperation *)operation {
  [oneToOneDependencies removeObject:operation];
  [self removeDependency:operation];
}
- (void)cancel {
  [super cancel];
  [oneToOneDependencies makeObjectsPerformSelector:@selector(cancel)];
}
@end
Run Code Online (Sandbox Code Playgroud)

注意:上述代码不保证没有错误.