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 回答
2

指针是双重复制的:一次将其传递给函数,另一次将其传递给块。要解决这个问题,您必须将指针传递给指针,以便您能够修改原始指针值:

-(void) doSomethingIntensive:(NSNumber **) valueRef
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_async(queue, ^{
        if(valueRef)
            *valueRef = [NSNumber numberWithInt:[*valueRef intValue] + 1];
    });
}

小心竞争条件,如果您需要使用主队列中的点,那么您需要使用互斥锁来保护它的访问。

于 2013-06-21T21:57:18.540 回答