私は非同期コールバックが初めてで、さまざまなアドバイスを受けています。非同期コールバックを実行する必要があり、何時間もの調査を行った後でも、ブロックまたは GCD とキューを使用する必要があるかどうかはわかりません。どんなポインタでも大歓迎です。
わかった。だから私が本当に求めていたのは:
「「非同期」コールバックを使用するには、GCD とキューを使用する必要がありますか?」
私が答えから集めているのは、答えはYESだということです。間違いなくGCDとブロック内のキュー。
私の混乱は、以下のコードのように、必要なのはブロックだけであるという指示が与えられたという事実から生じました。
[UIView animateWithDuration:.4f
animations:^{
flashView.alpha = 0.f;
}
completion:^(BOOL finished){
[flashView removeFromSuperview];
}
];
しかし、ここでの回答で私が見ているのは、上記のブロックが「非同期」コールバックを作成するには不十分であることです。代わりに、以下のコードのように、ブロック内でGCDとキューを使用する必要があります。
- (void)invokeAsync:(id (^)(void))asyncBlock resultBlock:(void (^)(id))resultBlock errorBlock:(void (^)(id))errorBlock {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id result = nil;
id error = nil;
@try {
result = asyncBlock();
} @catch (NSException *exception) {
NSLog(@"caught exception: %@", exception);
error = exception;
}
// tell the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSAutoreleasePool *secondaryPool = [[NSAutoreleasePool alloc] init];
if (error != nil) {
errorBlock(error);
} else {
resultBlock(result);
}
[secondaryPool release];
});
[pool release];
});
}