在我的一个应用程序中,我有一个NSOperationQueue和一些NSOperations子类。我添加了一些依赖项,所以操作A直到操作B完成才开始。
如果操作B失败,我需要取消操作A,但在操作B内部,我没有任何依赖于当前操作的操作列表。
我将尝试在子类中添加一些弱属性,如
@property (nonatomic, weak) NSArray *dependsOnMe;
但我害怕产生一些奇怪的循环。
谢谢
发布于 2013-10-02 01:20:16
这里漏掉了一些信息。比如,当你构造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侦听通知。
在B内..。
-(void)handleFailure
{
[[NSNotificationCenter defaultCenter] postNotificationName:BTypeOpDidFailNotification object:self userInfo:someInfoOrNil]
}
在A..。
-(void)setupWithBOp:(BOperation *)binstance
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ohNoBHazFailed:) name:BTypeOpDidFailNotification object:binstance];
}
记得在dealloc
上删除A作为观察者
发布于 2016-05-27 13:08:35
尽管我在讨论中为时已晚,但我已经写了一些东西来帮助我获得NSOperation的反向依赖关系。如果您知道所使用的队列,则可以使用以下扩展名:
extension NSOperationQueue {
func reverseDependenciesForOperation(op: NSOperation) -> [NSOperation] {
return operations.filter { $0.dependencies.contains(op) }
}
}
发布于 2013-10-02 00:57:31
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];
https://stackoverflow.com/questions/19132805
复制相似问题