18

Foundation Framework には 3 つの操作クラス ( NSOperationNSInvocationOperationおよびNSBlockOperation) があります。

同時実行プログラミング ガイドは既に読みましたが、これら 3 つのクラスの違いを正確に理解していませんでした。私を助けてください。

4

3 に答える 3

34

NSBlockOperationブロックを実行します。(またはターゲット、セレクター、オブジェクトで定義されたメソッド)NSInvocationOperationを実行します。サブクラス化する必要があるため、最も柔軟性が高くなりますが、最も多くのコードが必要になります。NSInvocationNSOperation

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

ほとんどのタスクでは、NSBlockOperation と NSInvocationOperation を使用するだけで十分です。


以下は、まったく同じことを行う 3 つすべてを使用するためのコード例です。

// 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];
}
于 2013-09-05T09:19:57.367 に答える
4

as par Apple docNSInvocationOperationNSBlockOperationBoth はサブクラスですNSOperation

NSInvocationOperation クラス

NSInvocationOperation クラスは、呼び出しとして指定された単一のカプセル化されたタスクの実行を管理する NSOperation の具体的なサブクラスです。このクラスを使用して、指定されたオブジェクトでセレクターを呼び出す操作を開始できます。このクラスは、非並行操作を実装します


NSBlockOperation クラス

NSBlockOperation クラスは、1 つ以上のブロックの同時実行を管理する NSOperation の具体的なサブクラスです。このオブジェクトを使用して、複数のブロックを一度に実行できます。それぞれに個別の操作オブジェクトを作成する必要はありません。複数のブロックを実行する場合、操作自体は、すべてのブロックの実行が終了したときにのみ終了したと見なされます。

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

于 2013-09-05T09:17:23.850 に答える
4

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

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

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

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

于 2013-09-05T09:17:35.097 に答える