Objective c GCD块内的增量NSNumber
如何增加GCD块内的NSNumber:Objective c GCD块内的增量NSNumber,objective-c,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] +
-(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];
});
}
从块继承的指针被视为“只读”。要修改该值,需要在其前面加上
\uu block
。在您的情况下,不能使用\uu 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);
});
您可以这样调用这样的函数:
- (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);
});
一般的想法是,当“密集操作”完成时,它会调用回调。从块继承的指针被视为“只读”。要修改该值,需要在其前面加上\uu block
。在您的情况下,不能使用\uu 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);
});
您可以这样调用这样的函数:
- (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);
});
一般的想法是,当“密集操作”完成时,它会调用回调。值指针是双重复制的:一次是将其传递给函数,另一次是将其传递给块。要解决此问题,必须将指针传递给指针,以便能够修改原始指针值:
-(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];
});
}
注意竞态条件,如果需要使用主队列中的点,则需要使用互斥来保护其访问。值指针是双重复制的:一次是在将其传递给函数时,另一次是在将其传递给块时。要解决此问题,必须将指针传递给指针,以便能够修改原始指针值:
-(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];
});
}
注意竞态条件,如果您需要使用主队列中的点,那么您需要使用互斥来保护它的访问。C仍然是通过值。NSNumber
仍然不是int
。什么是C??我无法更改值变量,因为它位于块内。我需要以某种方式将它标记为一个_块变量,但是在哪里!“什么是C?”-我希望不是很严重。C是字母表中的一个字母。。。我是孩子!lol.C仍然是通过值传递的。而且NSNumber
仍然不是int
。什么是C??我无法更改值变量,因为它位于块内。我需要以某种方式将它标记为一个_块变量,但是在哪里!“什么是C?”-我希望不是很严重。C是字母表中的一个字母。。。我是孩子!lol.NSInteger*结果
-为什么/如何?所以必须使用完成块。没有办法更改传入的值。我不想要完整的处理程序。如果传递的值为NSNumber,我希望更改相同的值。@CodaFi True!实际上是“只读”的,即原稿不能更改。@johndoe你必须这样做。您的GCD块是异步的。您的函数将在GCD块开始之前返回。NSInteger*result
-为什么/如何返回?因此必须使用完成块。没有办法更改传入的值。我不想要完整的处理程序。如果传递的值为NSNumber,我希望更改相同的值。@CodaFi True!实际上是“只读”的,即原稿不能更改。@johndoe你必须这样做。您的GCD块是异步的。您的函数将在GCD块启动之前返回。