2

次のブロックを実装するにはどうすればよいですか?

バックグラウンドでいくつかのタスクを実行する必要があります。バックグラウンド タスクが完了すると、いくつかのタスクがメイン スレッドで実行されます。

ブロックを使用する理由は、このメソッドに渡されるビューを更新する必要があるためです。

- (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.
        [self doSomeOtherTasksHere];

        [someView blahblah];

    }];
} 

または、これを実装する簡単な方法はありますか? ありがとう。

4

1 に答える 1

10

ブロックがどのように機能するのか、またはメインスレッドで完了ハンドラーを実行する方法について尋ねているのかどうかはわかりません。

コードに基づいて、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];
    });
});
于 2012-05-15T14:33:24.400 に答える