2

我对 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...为什么?!?!

4

3 回答 3

9

您没有执行块(调用块someFunction可能是一种误导)

__block int count = 0;
void (^someBlock)(void) = ^{
    count = 4;
};
someBlock();
count +=2;
于 2012-10-24T16:11:06.057 回答
5

像这样调用块:

someFunction();

所以那将是:

__block int count = 0;
void (^someFunction)(void) = ^(void){
    count = 4;
};
// call block
someFunction();

count +=2;
于 2012-10-24T16:11:00.443 回答
4

查看您正在调用的方法的名称; generateCGImagesAsynchronouslyForTimes: completionHandler:.

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

您需要从该完成块调用回需要响应完成的代码。IE

^() {
....
dispatch_async(dispatch_get_main_queue(), ^{[self heyManAnImageLoadedDude];});
....
}
于 2012-10-24T16:44:00.550 回答