私は、さまざまなコールバックで非同期操作を行うコードをいくつか使っています。 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
?多くのキューを作成すると、アーキテクチャの決定が悪いですか?これらのタスクを融合させるより良い方法はありますか?
FYI、あなたはNSTaskとNSPipeを漏らしています。 + newは+ alloc/-initに相当します。つまり、(あなたのコードでは)決して実行しない...それらを解放する責任があります。 (もちろん、GCを使用していない限り) –
Snow Leopard専用のプログラムです。私はあなたの新しいSnow-Leopard専用コードがガベージコレクションされていることを確かめたいと思います。 :-D –