NSoperation反向依赖

时间:2013-10-02 08:24:07

标签: ios objective-c nsoperation nsoperationqueue

在我的一个应用程序中,我有一个NSOperationQueue和一些NSOperations的子类。 我添加了一些依赖项,因此操作A在操作B完成之前不会启动。

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

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

@property (nonatomic, weak) NSArray *dependsOnMe;

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

感谢

3 个答案:

答案 0 :(得分:1)

虽然我在讨论中已经迟到了,但我所写的内容是为了帮助我获得NSOperation的反向依赖。如果您知道使用的队列,则可以使用此扩展名:

extension NSOperationQueue {
    func reverseDependenciesForOperation(op: NSOperation) -> [NSOperation] {
        return operations.filter { $0.dependencies.contains(op) }
    }
}

答案 1 :(得分: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失败,那么有意义的是从B取消B。但同样,A只会在B完成时启动。


来自here

  

依赖关系:您可以根据其他操作进行操作。   任何操作都可以依赖于任何数量的操作。当你   make操作A依赖于操作B,即使你打电话   操作A“启动”,除非操作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];

答案 2 :(得分: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;

或者使用“Shout out the window”方法并在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作为观察者