如何增加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];
});
}
答案 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];
});
}
请注意竞争条件,如果您需要使用主队列中的点,则需要使用互斥锁保护其访问权限。