ブロックから継承されたポインターは「読み取り専用」と見なされます。値を変更するには、プレフィックスを付ける必要があります__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);
});
一般的な考え方は、「集中的な操作」が完了すると、コールバックが呼び出されます。