私は、さまざまなコールバックを使用して一連の非同期操作を行うコードを使用しています。Snow Leopard は、ブロックと GCD を使用してこれを非常に簡単にしました。
私は次NSTask
のように呼び出してNSBlockOperation
います:
[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];
}];
このアプローチは完全に機能します。コールバックが同時実行を正しく処理する限り、これはまるで魔法のようです。
ここで、これらの呼び出しのいくつかを結合できるようにしたいと考えています。これはモデル オブジェクトの「refresh」メソッド内にあり、完了するまでに時間がかかる場合があります。ユーザーが更新ボタンを押しても、マシンなどすべてが拘束されることはありません。
ここで実装のジレンマを見ることができます。一連のキュー (呼び出しの種類ごとに 1 つ) を作成し、それらの同時操作数を 1 に設定し-cancelAllOperations
て、新しい呼び出しの時間になるといつでも呼び出すことができます。
別の方法として、現在発生している呼び出しを手動で記録し、モデル オブジェクトごとに 1 つのキューを管理することも (私が行っているように)、さらに進んでグローバル キューを使用することもできます。
の重さはNSOperationQueue
?多くのキューを作成することは、アーキテクチャ上の決定として不適切ですか? これらのタスクを結合するためのより良い方法はありますか?