1

GCD ブロック内にある NSNumber をインクリメントするにはどうすればよいですか。

  -(void) doSomethingIntensive:(NSNumber *) value
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

    dispatch_async(queue, ^{

        value = [NSNumber numberWithInt:[value intValue] + 1];

    });
}
4

2 に答える 2

4

ブロックから継承されたポインターは「読み取り専用」と見なされます。値を変更するには、プレフィックスを付ける必要があります__block。あなたの場合、それは引数であるため、接頭辞valueを付けることはできません。__blockできたとしても、GCD ブロックは非同期であり、CGD ブロックが呼び出される前に返されます。

あなたがやろうとしていることのために、次のようなことをする必要があります:

- (void)doSomethingIntensive:(NSNumber *)value complete:(void (^)(NSNumber *result))complete
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

    dispatch_async(queue, ^{
        if (complete) complete(@(value.integerValue + 1));
    });
}

このような関数を次のように呼び出します。

[doSomethingIntensive:@(1) complete^(NSNumber *result) {
    NSLog(@"%@", result);
});

一般的な考え方は、「集中的な操作」が完了すると、コールバックが呼び出されます。

于 2013-06-21T20:50:29.767 に答える