NSOperationQueueのドキュメント作成者が言及するのを忘れたことがあり、実際にはそうではないのに、そのような実装は些細なことのように見えます。
最大同時操作数を1に設定すると、NSOperationsが同じスレッドからキューに追加された場合にのみシリアルであることが保証されます。
それがうまくいくので、私は別のオプションを使用しています。
異なるスレッドからNSOperationsを追加しますが、キューイングを管理するにはNSConditionを使用します。startOperationsは、performSelectorOnBackgroundThreadで呼び出すことができます(そして、ロックでメインスレッドをブロックしたくない場合もあります)。
startOperationsメソッドは、1つ以上のNSOperationsで構成される単一のジョブを表します。
- (void)startOperations
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[[AppDelegate condition] lock];
while (![[[AppDelegate queue] operations] count] <= 0)
{
[[AppDelegate condition] wait];
}
NSOperation *newOperation = [alloc, init]....;
[[AppDelegate queue] addOperation:newOperation];
[[AppDelegate queue] waitUntilAllOperationsAreFinished]; // Don't forget this!
NSOperation *newOperation1 = [alloc, init]....;
[[AppDelegate queue] addOperation:newOperation1];
[[AppDelegate queue] waitUntilAllOperationsAreFinished]; // Don't forget this!
NSOperation *newOperation2 = [alloc, init]....;
[[AppDelegate queue] addOperation:newOperation2];
[[AppDelegate queue] waitUntilAllOperationsAreFinished]; // Don't forget this!
// Add whatever number operations you need for this single job
[[AppDelegate queue] signal];
[[AppDelegate queue] unlock];
[NotifyDelegate orWhatever]
[pool drain];
}
それでおしまい!