0

私は2つの非同期メソッドを実行しています(参照についてはこのSOスレッドを参照してください)。

私がこのシナリオを持っている場合を除いて、それは完璧に機能しています。いずれかの方法でエラーが発生した場合、ユーザーにこの情報を表示するので、ブロックでエラーをチェックして次のようにします。

if(error) {
    int64_t delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), {

    // Show a popup for 2.0 seconds alerting the user of the error
    });
}

これは問題なく機能します。ただし、これらの非同期操作の両方にエラーがある場合に問題が発生します。終了する最初のメソッドは、おそらくわずか0.5秒間エラーを表示し、次に2番目の非同期操作は2.0秒間エラーを表示します(すでにエラーメッセージが表示されていることを考慮していません)。

したがって、すでにエラーメッセージが表示されているかどうかを確認し、そのエラーメッセージが消えるのを待って(2.0秒)、すぐに2番目のエラーメッセージを表示するプロセスが必要です。

4

2 に答える 2

2

これらのエラーをユーザーに表示するためのキューを実装するだけでよいようです。SSHUDView次のような単純なインターフェイスを使用して、 のカテゴリとして実行できます。

@interface SSHUDView (queue)
- (void)showForDuration:(NSTimeInterval)duration;
@end

シリアル GCD キューを使用して実装します。

@implementation SSHUDView (queue)

- (void)showForDuration:(NSTimeInterval)duration {
    static dispatch_once_t once;
    static dispatch_queue_t queue;
    dispatch_once(&once, ^{
         queue = dispatch_queue_create("SSHUDView(serial)", 0);
    });

    dispatch_async(queue, ^{
        dispatch_sync(dispatch_get_main_queue(), ^{
            [self show];
        });

        usleep(duration * USEC_PER_SEC);

        dispatch_sync(dispatch_get_main_queue(), ^{
            [self dismiss];
        });
    });
}

@end
于 2012-12-01T19:19:48.500 に答える