3

MyI には NSOperation オブジェクトを含む NSOperationQueue があります

NSOperationQueue *aQueue = [[ NSOperationQueue alloc ] init];
[aQueue setMaxConcurrentOperationCount:3];

for (int index=0; index<=5; index++) {
    MYOperation *anOperation = [[MYOperation alloc] init];//MYOperation subclass from NSOperation
    [aQueue addOperation:anOperation];
}
NSLog(@"Number of Operations:%d",[aQueue operationCount]);//It gives 5 count

キューでは、一度に 3 つの操作しか実行できません (定義による)。4番目の操作を追加しようとすると、キューに追加されますが、操作は実行されず、破棄されます。

質問: キューがその同時実行値よりも多くの操作を破棄するのはなぜですか?

4

1 に答える 1

4

NSOperationQueueバックグラウンドで送信された操作を実行するスレッドを管理します。(Grand Central Dispatch を使用する 10.6 以降)。送信された操作は、既定ではセカンダリ スレッドで実行されます。
操作のバッチを送信した後、すぐに操作キューを照会しています。その時点で、キューは操作の実行を開始していない可能性があるため、合計操作数 6 が正しく報告されます。
キューを照会する前に遅延を追加すると、すでにすべての操作が終了しており、カウントが 0 であることが報告されています。

サンプルコード:

NSOperationQueue *aQueue = [[ NSOperationQueue alloc ] init];
[aQueue setMaxConcurrentOperationCount:3];

for (int index=0; index<=5; index++) {
    MYOperation *anOperation = [[MYOperation alloc] init];//MYOperation subclass from NSOperation
    [aQueue addOperation:anOperation];
}

double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    NSLog(@"Number of Operations:%d",[aQueue operationCount]);//It gives 5 count
});
于 2013-05-22T08:20:51.093 に答える