0

Webサービスからデータをロードする小さなiPhoneアプリがあります。データの読み込み中に問題が発生しないことを確認するために、アプリ上に半透明のビューを作成し、CFRunloopRun()を使用して、すべてのデータがバックグラウンドで読み込まれるまで待機します。これはそのためのコードです:

        self.connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

    // Now show an animation
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    UIView *window = [[UIApplication sharedApplication] keyWindow];
    UIView *shield = [[UIView alloc] initWithFrame:window.bounds];
    shield.backgroundColor = [UIColor blackColor];
    shield.alpha = 0.5f;
    [window addSubview:shield];
    spinner.center = shield.center;
    [shield addSubview:spinner];
    spinner.hidden = NO;
    NSLog( @"JCL.callServerWithRequest(), spinner view: %@, shield view: %@, window: %@", spinner, shield, window );
    [spinner startAnimating];

    // Hand over to the Runnloop to wait
    CFRunLoopRun();

    [spinner stopAnimating];
    [spinner removeFromSuperview];
    [spinner release];
    [shield removeFromSuperview];
    [shield release];

これは正常に機能しますが、ロード後にどこかのボタンのクリックが再生されるため、ユーザーがダウンロードボタンを2回クリックすると、ダウンロードも2回実行されます。

シールドが削除される前にUIイベントを消費する方法についてのアイデア。

ありがとう-アンディ

4

2 に答える 2

0

runloopsをいじらずに試してみてください。UIイベントはウィンドウの通常のループに入ってきますが、カスタムループが戻るまで処理されないのではないかと思います。その時点で、「シールド」ビューはそれらをキャッチするために存在しなくなります。シールドを所定の位置に配置してから、メインのランループに処理を任せると、シールドはそれらすべてを通常どおりにキャッチするはずです。

于 2011-03-19T02:00:58.717 に答える
0

Anomieのおかげで、私はついにCFRunLoopRun()なしで行こうとしましたが、実行が2つの部分に分割されているため、非常に困難です。-呼び出しとコールバックによる結果の戻り。しかし、メインスレッドで再度実行されたために機能しなかった実行を遅くするために、戻ってきたスレッドをブロックしようとしたため、私はことわざの足で自分自身を撃ちました。

最終的に私はWebサービスの速度を落とし、その後すべてが期待どおりに機能しました。

于 2011-03-19T23:39:48.270 に答える