2

在我的一个应用程序中,我有一个 NSOperationQueue 和一些 NSOperations 子类。我添加了一些依赖项,所以操作 A 直到操作 B 完成才开始。

如果操作 B 失败,我需要取消操作 A,但是从操作 B 内部,我没有任何依赖于当前操作的操作列表。

我会尝试在我的子类上添加一些弱属性,比如

@property (nonatomic, weak) NSArray *dependsOnMe;

但我害怕产生一些奇怪的循环。

谢谢

4

3 回答 3

2

尽管我在讨论中已经很晚了,但这是我为帮助我获得 NSOperation 的反向依赖而编写的内容。如果你知道使用的队列,那么你可以使用这个扩展:

extension NSOperationQueue {
    func reverseDependenciesForOperation(op: NSOperation) -> [NSOperation] {
        return operations.filter { $0.dependencies.contains(op) }
    }
}
于 2016-05-27T21:08:35.793 回答
0
 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取消。但同样,只有在完成时才会开始。BBAB


这里

依赖:你可以使一个操作依赖于其他操作。任何操作都可以依赖于任意数量的操作。当您使操作 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];
于 2013-10-02T08:57:31.177 回答
0

这里缺少一些信息。就像你构造 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

于 2013-10-02T09:20:16.110 回答