Objective-C中的块变量

3

我有一个关于Objective-C中的块的问题。

例如,我有以下代码:

__block int count = 0;
void (^someFunction)(void) = ^(void){
count = 4;
};
count +=2;

如何正确编写相同的代码,使计数变为6而不是2?

谢谢!

我应该展示实际的代码,因为我的上一个问题不够清晰。

__block CMTime lastTime = CMTimeMake(-1, 1);
    __block int count = 0;
    [_imageGenerator generateCGImagesAsynchronouslyForTimes:stops
                                          completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime,
                                                              AVAssetImageGeneratorResult result, NSError *error)
     {
         if (result == AVAssetImageGeneratorSucceeded)
         {
             NSImage *myImage = [[NSImage alloc] initWithCGImage:image size:(NSSize){50.0,50.0}];
             [arrOfImages addObject:myImage];
         }

         if (result == AVAssetImageGeneratorFailed)
         {
             NSLog(@"Failed with error: %@", [error localizedDescription]);
         }
         if (result == AVAssetImageGeneratorCancelled)
         {
             NSLog(@"Canceled");
         }
         if (arrOfImages.count > 5)
         {
             NSLog(@"here");
         }
         count++;
     }];
     int f = count+1;

进行了10次迭代后,计数器为0...为什么?!?!

3个回答

10

您没有执行该代码块(调用一个名为someFunction的代码块可能会产生误导)

__block int count = 0;
void (^someBlock)(void) = ^{
    count = 4;
};
someBlock();
count +=2;

1
在块实现(赋值的右侧)中,您不需要通过添加void来声明参数的缺失。 - vikingosegundo
我唯一的问题是,当我在块内部使用的全局变量是否会保留它们在块内部获得的值? - Eugene Gordin

6
像这样进行调用阻塞:
someFunction();

那么,这将是:
__block int count = 0;
void (^someFunction)(void) = ^(void){
    count = 4;
};
// call block
someFunction();

count +=2;

4

请注意你所调用的方法名称:generateCGImagesAsynchronouslyForTimes: completionHandler:

异步意味着它在不同的线程中执行(可能通过队列执行,并且像@newaccount指出的那样,它可能会被重新安排在当前队列/线程上进行未来执行),而且该方法立即返回。 因此,当你设置f=count+1;时,完成块甚至还没有被执行,因为后台线程中的图像加载尚未完成。

你需要从完成块中发出一个调用,以便回到需要响应完成的代码中。也就是说:

^() {
....
dispatch_async(dispatch_get_main_queue(), ^{[self heyManAnImageLoadedDude];});
....
}

异步并不一定意味着不同的线程。您可以在同一个线程上异步执行任务。 - newacct
1
@newacct "异步"意味着该方法将立即返回,因此您无法在没有某种同步手段的情况下执行任何操作。已添加澄清。 - bbum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接