2

Objective-C のブロックについて質問があります。

たとえば、次のコードがあります。

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

カウントが 2 ではなく 6 になるように、同じコードを記述する適切な方法は何でしょうか?!

ありがとうございました!

私の前の質問はぼやけていたので、おそらく実際のコードを表示する必要があります。編集:

__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;すると、バックグラウンド スレッドでのイメージの読み込みが完了していないため、完了ブロックはまだ実行されていません。

完了に応答する必要があるコードに、その完了ブロックから呼び出しを行う必要があります。すなわち

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