2009-10-03 6 views
6

私は、さまざまなコールバックで非同期操作を行うコードをいくつか使っています。 Snow LeopardはブロックとGCDでこれを非常に簡単にしました。Snow LeopardのNSOperationQueueはどの程度軽量ですか?

私はそうのようなNSBlockOperationからNSTaskを呼んでいる:

[self.queue addOperationWithBlock:^{ 
    NSTask *task = [NSTask new]; 
    NSPipe *newPipe = [NSPipe new]; 
    NSFileHandle *readHandle = [newPipe fileHandleForReading]; 
    NSData *inData = nil; 
    [task setLaunchPath:path]; 
    [task setArguments:arguments]; 
    [task launch]; 

    while ((inData = [readHandle availableData]) && [inData length]) { 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      // callback 
     }]; 
    } 

    [task waitUntilExit]; 
}]; 

このアプローチは完璧に動作します。コールバックが並行処理を正しく処理する限り、それは魔法と似ています。

ここで、これらの呼び出しのいくつかを統合することができます。これはモデルオブジェクトの「リフレッシュ」メソッド内にあり、完了に時間がかかることがあります。ユーザーがリフレッシュボタンを押しても、マシンとそのすべてが縛られてはいけません。

私はここで実装のジレンマを見ることができます。コールタイプごとに1つのキューを作って、その同時操作数を1に設定してから、新しいコールがあるときはいつでも-cancelAllOperationsに電話することができます。

また、コールが現在発生しているモデルブックオブジェクトを作成したり、モデルオブジェクトごとに単一のキューを管理したりすることもできます。さらにグローバルキューを使用することもできます。

どのくらい重いですかNSOperationQueue?多くのキューを作成すると、アーキテクチャの決定が悪いですか?これらのタスクを融合させるより良い方法はありますか?

+2

FYI、あなたはNSTaskとNSPipeを漏らしています。 + newは+ alloc/-initに相当します。つまり、(あなたのコードでは)決して実行しない...それらを解放する責任があります。 (もちろん、GCを使用していない限り) –

+1

Snow Leopard専用のプログラムです。私はあなたの新しいSnow-Leopard専用コードがガベージコレクションされていることを確かめたいと思います。 :-D –

答えて

8

パフォーマンスが懸念される場合は、推測しないでください。見つけたボトルネックを測定して修正してください。キューを追加するのは簡単です。それを試してみて、楽器がパフォーマンスに及ぼす影響について教えてください。

複数のキューを作成する主な理由は、それらを開始および停止したい理由がある場合です。 libdispatchの利点を得たいだけなら、メインキューに操作を追加するだけでそれを得ることができます。

0

好きなだけ多くの操作キューを使用してください。彼らはあなたのプログラムの論理部分を分離するためにここにいます。私は毎秒何百ものキューを割り当てていない限り、パフォーマンスについてあまり心配するべきではないと思います。

+0

ウェブサイトですか?これはウェブサイトと何が関係していますか? –

+0

ありがとう、朝はまだ早すぎます。 :) –

1

同時に実行されるNSBlockOperationに複数のブロック を追加することができ、包含する操作をキャンセルすることでキャンセルすることができます。 あなたの個々のタスクをシリアル化する必要がない限り、これは機能するかもしれません。

+0

これは、ドキュメントが言うことではありません: "NSBlockOperationクラスは、1つ以上のブロックの同時実行を管理するNSOperationの具体的なサブクラスです。" http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/NSBlockOperation_class/Reference/Reference.html –

+0

ジム、あなたは絶対に正しいです。回答が更新されました。ありがとう。 –

関連する問題