15

xCode 4.4.1 OSX 10.8.2、[operation cancelAllOperations] のように見えます。動作していません

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSOperationQueue *operation = [[NSOperationQueue alloc] init];
    [operation setMaxConcurrentOperationCount: 1];
    [operation addOperationWithBlock: ^{
        for (unsigned i=0; i < 10000000; i++) {
            printf("%i\n",i);
           }
    }];
    sleep(1);
    if ([operation operationCount] > 0) {
        [operation cancelAllOperations];
    }
}

結果 9999999

4

1 に答える 1

30

ブロック内、特にループ内-isCancelledで、操作を呼び出します。それが本当なら、戻ってください。

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount: 1];

NSBlockOperation *operation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakOperation = operation;
[operation addExecutionBlock: ^ {
    for (unsigned i=0; i < 10000000; i++) {
        if ([weakOperation isCancelled]) return;
        printf("%i\n",i);
    }
}];
[operationQueue addOperation:operation];

sleep(1);

if ([operationQueue operationCount] > 0) {
    [operationQueue cancelAllOperations];
}

キューは操作の実行を任意に停止することはできません。クリーンアップされていない操作によって共有リソースが使用されていた場合はどうなるでしょうか。キャンセルされたことが判明した場合、操作を適切に終了するのはユーザーの責任です。Appleのドキュメントから:

操作オブジェクトは、定期的に isCancelled を呼び出し、メソッドが YES を返した場合にそれ自体を停止する責任があります。

于 2012-09-30T11:04:56.997 に答える