1

他の NSOperations の NSOperationQueue を含む NSOperation (A と呼びます) を拡張します (これは A とは異なる別の拡張クラスであり、これらの操作を B と呼びます)。操作 A が実行中 (B 操作を実行中) に、B 操作で特定のイベントが発生したときに、操作 A で特定の関数/メソッドを呼び出すにはどうすればよいですか? たとえば、それを終了するすべての操作 B は、それ自体を返す操作 A で関数を呼び出しますか?

*ネストされた NSOperation および NSOperationQueue(s)

このモックアップ疑似コードが絵を描くのに役立つことを願っています。

//My classes extended from NSOperation

NSOperation ClassA

NSOperation ClassB

//MainApp

-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    ClassA A1;

    ClassA A2;

    NSOperationQueue Queue;
    Queue AddOperation: A1;
    Queue AddOperation: A2;


}

//Main of ClassA

-(void)main {

     ClassB B1;

     ClassB B2;

     NSOperationQueue Queue;
     Queue AddOperation: B1;
     Queue AddOperation: B2;

}

//Main of ClassB

-(void)main {

   //Do some work and when done call selector on ClassA above

}
4

2 に答える 2

1

NSOperation依存関係を登録するメカニズムがあります。NSOperationのドキュメントとを参照してくださいaddDependency:

作業を分割してみましょう:: sを生成Aし、:でデータを収集します。なしで使えるようにデザインしたほうがいいと思います。データをダウンロードして、プロパティに保持します。AXBAYBBABdata

@interface B:NSOperation{
}
-initWithURL:(NSURL*)url atPosition:(NSUInteger)position;
@property (readonly)NSData* data;
@end;

Aオブジェクトごとに1つずつ、独自のキューを持つ必要はありません。'の生成Bにもそれほど時間AXはかからないので、操作である必要はありません。

したがって、操作AYを定義し、Bキューを1つだけ準備して、次のようなことを実行します。

NSOperationQueue* queue=...;
NSArray* urls = ... ;
for(NSURL* url in urls){
     AY* ay=[[AY alloc] init];
     for(chunks in url){
         B* b= an instance for B for the chunk in url
         [ay addDependency:b];
         [queue addOperation:b];
     } 
     [queue addOperation:ay];
}

次に、AYメインで、次のことができます

-main{
      NSArray*bs=[self dependencies];
      for(B*b in bs){
           NSData* data=b.data;
      }
}

依存関係のおかげで、AYが実行されると、すべてのがB操作を終了することが保証されていることに注意してください。このように、の実装は。Bから独立していAます。

于 2010-05-12T02:52:08.157 に答える
0

現在取り組んでいるアプリの NSOperations をネストする MXSuperOperation というクラスを作成しました。ここに投稿しました:

https://gist.github.com/joerick/e4d2c99a2127715d9bc3

MXSuperOperation をサブクラス化し、-mainError: メソッドにサブオペレーションを追加します。

@interface OperationA : MXSuperOperation

@end

@implementation OperationA

- (BOOL)mainError:(NSError **)error
{
    [self addSuboperation:[OperationB new]];
    [self addSuboperation:[OperationB new]];

    return YES;
}

@end

次に、すべてのOperationBs の最後に何かを実行するには、operationA に completionBlock を追加します。

[operationA setCompletionBlockWithSuccess:^(id operation) {
    NSLog(@"success");
} failure:^(id operation, NSError *error) {
    NSLog(@"error %@", error);
}];

または、OperationA に実装することもできます-endError:(コードをどのように構成するかによって異なります)。

このクラスは、私が作成した MXCheckedOperation と呼ばれる NSOperation サブクラスに基づいて構築されていることに注意してください。これは、NSOperations の成功/失敗およびエラー レポートをコード化するだけです。

于 2015-03-27T14:43:27.030 に答える