在我的一个应用程序中,我有一个 NSOperationQueue 和一些 NSOperations 子类。我添加了一些依赖项,所以操作 A 直到操作 B 完成才开始。
如果操作 B 失败,我需要取消操作 A,但是从操作 B 内部,我没有任何依赖于当前操作的操作列表。
我会尝试在我的子类上添加一些弱属性,比如
@property (nonatomic, weak) NSArray *dependsOnMe;
但我害怕产生一些奇怪的循环。
谢谢
在我的一个应用程序中,我有一个 NSOperationQueue 和一些 NSOperations 子类。我添加了一些依赖项,所以操作 A 直到操作 B 完成才开始。
如果操作 B 失败,我需要取消操作 A,但是从操作 B 内部,我没有任何依赖于当前操作的操作列表。
我会尝试在我的子类上添加一些弱属性,比如
@property (nonatomic, weak) NSArray *dependsOnMe;
但我害怕产生一些奇怪的循环。
谢谢
尽管我在讨论中已经很晚了,但这是我为帮助我获得 NSOperation 的反向依赖而编写的内容。如果你知道使用的队列,那么你可以使用这个扩展:
extension NSOperationQueue {
func reverseDependenciesForOperation(op: NSOperation) -> [NSOperation] {
return operations.filter { $0.dependencies.contains(op) }
}
}
I've added some dependencies so, the operation A not start until operation B finish.
和:
I need to cancel the operation A if the operation B fails
你知道这是怎么回事吗?
什么是有意义的,如果失败则B
取消。但同样,只有在完成时才会开始。B
B
A
B
从这里:
依赖:你可以使一个操作依赖于其他操作。任何操作都可以依赖于任意数量的操作。当您使操作 A 依赖于操作 B 时,即使您在操作 A 上调用“start”,它也不会启动,除非操作 B isFinished 为真。例如:
MyDownloadOperation *downloadOp = [[MyDownloadOperation alloc] init]; // MyDownloadOperation is a subclass of NSOperation
MyFilterOperation *filterOp = [[MyFilterOperation alloc] init]; // MyFilterOperation is a subclass of NSOperation
[filterOp addDependency:downloadOp];
这里缺少一些信息。就像你构造 B 时一样,你也构造 A 吗?
有必要这样做吗?为什么不在 B 成功完成后构造 A?
如果从 B 到 A 的一对一依赖关系,您可以使用委托协议
@protocol DependantOperationCompletion <NSObject>
-(void)operationDidFail;
@end
@interface BOperation
@property (weak) id<DependantOperationCompletion> delegate;
@end
和
@interface AOperation:NSOperation <DependantOperationCompletion>
...
@end
然后当您构造操作时,将 A 设置为 B 的代表
bOpInstance.delegate = aOpInstance;
或者,如果 B 失败,则使用“向窗外喊”的方法并发布通知。A 监听通知。
内...
-(void)handleFailure
{
[[NSNotificationCenter defaultCenter] postNotificationName:BTypeOpDidFailNotification object:self userInfo:someInfoOrNil]
}
在一个...
-(void)setupWithBOp:(BOperation *)binstance
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ohNoBHazFailed:) name:BTypeOpDidFailNotification object:binstance];
}
记得删除 A 作为观察者dealloc