ios – 如何取消NSOperation的依赖项?

我在依赖图中有一些NSOperations:
NSOperation *op1 = ...;
NSOperation *op2 = ...;

[op2 addDependency:op1];

这是我如何运行它们:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op1];
[queue addOperation:op2];

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

我尝试过的:

在NSOperation上调用取消不会取消另一个(据我所知):

[op1 cancel]; // doesn't cancel op2
// -- or --
[op2 cancel]; // doesn't cancel op1

取消队列也会取消不属于op1和op2的依赖关系图的操作(如果队列中有任何此类操作):

[queue cancelAllOperations];

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

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

解决方法

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

您可以考虑编写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

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...