1

私の iPhone アプリケーションにはボタンがあり、ボタンをクリックすると Web サービスが呼び出され、いくつかのリンクが取得されます。その後、それらのリンク内のファイルをダウンロードする必要があります。ボタンをクリックするとポップアップ ビューが表示され、[OK] をクリックすると、ボタンが進行状況バーに変わり、ダウンロードの進行状況が表示されます。ダウンロードが完了すると、進行状況バーは再びボタンに置​​き換えられます。ここで私が抱えている問題は、インターネット接続が遅い場合、UI がブロックされ、サーバーから詳細を完全に取得するまで [OK] ボタンが押されたままになり、その後に進行状況バーが表示されることです。OKボタンをクリックした直後にプログレスバーを表示したいのですが、UIをロックしてはいけません。次の方法を使用しました。

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
                                             (unsigned long)NULL), ^(void) {
        [self download];
    });

この場合、UI はロックされませんでしたが、プログレス バーは表示されませんでした。そして、私は使用しました

    [self performSelectorInBackground:@selector(download) withObject:nil];

この場合、UI はブロックされませんでしたが、サーバーから詳細を取得するまでダウンロード ボタンが表示されています。そのときだけ、進行状況バーが表示されます。

ダウンロードのコード フローは次のとおりです。

- (void)download{
   //Creating a custom progressview
    myprogressView = [[CustomProgressView alloc]initWithFrame:CGRectMake(25, 138, 100, 28)];
    [cell.contentView addSubview:myprogressView];
    [cell bringSubviewToFront:myprogressView];

    //Calling the methods for getting the details from the server

    //after some internal process, start download
    [self.myQueue go];
}

あなたのアイデアを共有してください

4

2 に答える 2

2

バックグラウンド スレッドで UI を変更しないようにしてください。UI 関連のタスクはすべてメイン スレッドで実行する必要があります。デリゲート メソッドを呼び出して、データが入ってくるとすぐに UI を更新できます。

ここで、バックグラウンド スレッドで UI 関連のタスクを実行していることがわかります...その理由は、UIKit がスレッド セーフではないためです... :/

于 2012-07-24T06:25:56.047 に答える
1

まず、進行状況ビューとしてボタンを置き換えます。次に、ダウンロードを開始します。つまり、ボタンを押すイベントでUIを変更してから、[self.myQueue go];

于 2012-07-24T06:22:43.763 に答える