增加GCD块内的NSNumber

时间:2013-06-21 20:44:59

标签: objective-c

如何增加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];

    });
}

2 个答案:

答案 0 :(得分: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);
});

一般的想法是,当你的“密集操作”完成后,它会调用你的回调。

答案 1 :(得分: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];
    });
}

请注意竞争条件,如果您需要使用主队列中的点,则需要使用互斥锁保护其访问权限。