2013-09-05 10 views
13

の違いは何Foundationフレームワーク(NSOperationNSInvocationOperationNSBlockOperation)における3つの動作クラスがあります。
NSInvocationOperationとNSBlockOperation

私は既にconcurrency programming guideを読んでいますが、これらの3つのクラスの違いを正確に理解できませんでした。私を助けてください。パーアップルのドキュメントNSInvocationOperationNSBlockOperationとして

答えて

3

の両方がNSInvocationOperationクラスが呼び出しで指定した、1つのカプセル化されたタスクの実行を管理NSOperationの具象サブクラスであるNSOperation

NSInvocationOperation Class

のサブクラスです。このクラスを使用して、指定されたオブジェクトのセレクターを呼び出す操作を開始できます。このクラスは、NSBlockOperationクラスは、1つのまたは複数のブロックの同時実行を管理NSOperationの具象サブクラスである非同時動作


NSBlockOperation Class

を実装しています。このオブジェクトを使用すると、それぞれに別々の操作オブジェクトを作成することなく、複数のブロックを一度に実行できます。複数のブロックを実行する場合、すべてのブロックの実行が終了した場合にのみ、処理自体は終了したとみなされます。

ブロック操作に追加されたブロックは、デフォルトの優先順位で適切な作業キューにディスパッチされます。ブロック自体は、実行環境の設定について何も仮定すべきではありません。

3

NSOperationは基本クラスです。すべての操作はNSOperationを拡張します。しかし、それは抽象クラスです。つまり、サブクラス化して実際の操作を実行するコードを実装する必要があります。

単純なケースでは、これは(独自のサブクラスを作る)必要はありません。

メッセージをオブジェクトに渡す場合は、NSInvocationOperationを使用できます。これは、セレクタとターゲットオブジェクトでパラメータ化できるNSOperationの実装です。

ブロックをもう一度呼び出す場合は、NSBlockOperationを使用できます。これはNSOperationの実装で、呼び出すブロックでパラメータ化できます。

27

NSBlockOperation exectues a block。 NSInvocationOperationNSInvocation(またはtarget、selector、objectで定義されたメソッド)を実行します。 NSOperationはサブクラス化する必要がありますが、柔軟性は最も高くなりますが、ほとんどのコードが必要です。

NSBlockOperationとNSInvocationOperationは両方ともNSOperationのサブクラスです。これらはシステムによって提供されるため、単純なタスク用に新しいサブクラスを作成する必要はありません。

NSBlockOperationとNSInvocationOperationを使用すると、ほとんどのタスクで十分です。あなたがお互いからそれらを分離するために、各操作に異なるテキストを使用した場合

// For NSOperation subclass 
@interface SayHelloOperation : NSOperation 
@end 

@implementation SayHelloOperation 

- (void)main { 
    NSLog(@"Hello World"); 
} 

@end 

// For NSInvocationOperation 
- (void)sayHello { 
    NSLog(@"Hello World"); 
} 


- (void)startBlocks { 
    NSBlockOperation *blockOP = [NSBlockOperation blockOperationWithBlock:^{ 
     NSLog(@"Hello World"); 
    }]; 
    NSInvocationOperation *invocationOP = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(sayHello) object:nil]; 
    SayHelloOperation *operation = [[SayHelloOperation alloc] init]; 

    NSOperationQueue *q = [[NSOperationQueue alloc] init]; 
    [q addOperation:blockOP]; 
    [q addOperation:invocationOP]; 
    [q addOperation:operation]; 
} 
+1

それがいいだろう。ここでは


はまったく同じことがない3つのすべてを使用するためのコード例です何度も "Hello World"の代わりに。ちょうど提案 – c0d3Junk13

関連する問題