Objective c 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] +

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

    });
}

从块继承的指针被视为“只读”。要修改该值,需要在其前面加上
\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块启动之前返回。