2

私のアプリの1つに、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

ここには少し欠けている情報があります。B を構築するときのように、 A も構築しますか?

これを行う必要はありますか?B が正常に完了したときに A を構築しないのはなぜですか?

B から A への 1 対 1 の依存関係である場合は、デリゲート プロトコルを使用できます。

@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]

}

以内...

-(void)setupWithBOp:(BOperation *)binstance
{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ohNoBHazFailed:) name:BTypeOpDidFailNotification object:binstance];

}

オブザーバーとして A を削除することを忘れないでくださいdealloc

于 2013-10-02T09:20:16.110 に答える
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 で「開始」を呼び出しても、操作 B の isFinished が true でないと開始されません。例えば:

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 に答える