我对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 ......为什么?!?!
答案 0 :(得分:6)
您没有执行该块(调用块someFunction
可能是一个误导性的事情)
__block int count = 0;
void (^someBlock)(void) = ^{
count = 4;
};
someBlock();
count +=2;
答案 1 :(得分:5)
像这样调用块:
someFunction();
那就是:
__block int count = 0;
void (^someFunction)(void) = ^(void){
count = 4;
};
// call block
someFunction();
count +=2;
答案 2 :(得分:4)
查看您正在呼叫的方法的名称; generateCGImagesAsynchronouslyForTimes: completionHandler:
。
异步意味着它在不同的线程中执行(可能通过队列,并且,因为@newaccount指向,它可能会重新调度以便将来在当前队列/线程上执行)和方法立即返回。因此,当您设置f=count+1;
时,尚未执行完成块,因为后台线程中没有任何图像加载已完成。
您需要从完成块调用回到需要响应完成的代码。即。
^() {
....
dispatch_async(dispatch_get_main_queue(), ^{[self heyManAnImageLoadedDude];});
....
}