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)
取消队列也将取消不属于的依赖图的部分的操作op1和op2(如果有在队列中的任何这样的操作):
[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)
注意:上述代码不保证没有错误.