ブロックがどのように機能するのか、またはメインスレッドで完了ハンドラーを実行する方法について尋ねているのかどうかはわかりません。
コードに基づいて、doSomethingInBackground を呼び出し、2 つのブロックをパラメーターとして渡します。これらのブロックは、実行するために doSomethingInBackground メソッドで呼び出す必要があります。doSomethingInBackground は次のようになります。
-(void)doSomethingInBackground:(void (^))block1 completion:(void (^))completion
{
// do whatever you want here
// when you are ready, invoke the block1 code like this
block1();
// when this method is done call the completion handler like this
completion();
}
完了ハンドラがメイン スレッドで実行されるようにしたい場合は、コードを次のように変更します。
- (void)doALongTask:(UIView *)someView {
[self doSomethingInBackground:^{
// Runs some method in background, while foreground does some animation.
[self doSomeTasksHere];
} completion:^{
// After the task in background is completed, then run more tasks.
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomeOtherTasksHere];
[someView blahblah];
});
}];
}
それがあなたが書いたコードに基づく私の答えです。
ただし、このコメント「いくつかのタスクをバックグラウンドで実行する必要があります。その後、バックグラウンド タスクが完了すると、いくつかのタスクがメイン スレッドで実行されます」というコメントが、実際に何をしようとしているのかを示している場合は、これを行う必要があります。 :
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// do your background tasks here
[self doSomethingInBackground];
// when that method finishes you can run whatever you need to on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomethingInMainThread];
});
});