2011-12-14 7 views
0

私はiPadアプリを書いていて、uiの応答性/ロックアップに問題があります。RunLoop with UITableViewロックアップ

私はUITableViewアイテムをクリックすると、インターネット上に出てそのアイテムを取り出して表示します。残りのプログラム(図示せず)はダウンロードされたアイテムを使用するので、一度に1つのアイテムしかダウンロードすることができない。

アイテムを取得するのに時間がかかることがあります。その間、ユーザーはUITableViewをスクロールすることはできますが、クリックされた前の項目がダウンロードされるまでは何も選択できないようにしたいと考えています。

これはスレッド、ブロック、コールバックを使用して行うことができますが、今私はそれを行う時間がありません(不可能な時間制約)。

私は簡単な方法は、順次、それをダウンロードして実行するループと、この2段階のプロセスのようなフラグを使用するだろうと思った:

テーブルセルのdidSelectRowAtIndexPath上のユーザーがクリックが呼び出される
  1. 、そこに私はグローバルフラグを設定し、ダウンロードメソッドを呼び出してアイテムをダウンロードします。 。

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
        static BOOL alreadyInHere=FALSE; 
        if (alreadyInHere) return; 
        alreadyInHere=TRUE; 
        .... 
        downloadItem(...); 
        ShowAndUseItem(...); 
        alreadyInHere=FALSE; 
    } 
    

    これにより、ユーザは一度に一つのアイテムを選択することができます:ユーザーが別の項目をクリックすると、ダウンロードが完了する前に(、それはフラグをチェックし、何もダウンロードせずに機能を終了基本的にこれが表示されます。

  2. は、ユーザーがまだ長いダウンロード中のUITableViewをスクロールすることができるようにするために、私は...このように上に示したdownloadItem(...)メソッドで実行ループに入れ

    -(void) downloadItem(....) 
    { 
        BOOL downloading=TRUE; 
        callFunctionsToStartdownload(...); // 
        while (downloading) { 
         downloading=DownloadSomeBytes(...); 
         CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, YES); 
        } 
    } 
    

(1)と(2)の結果は、ユーザーが順次ダウンロード中にUITableViewをスクロールできることです。alreadyInHereフラグは何かを選択して別のダウンロードを開始するのを防ぎます。

これはほとんどの場合有効ですが、ダウンロード中に約50%の時間がかかると、UITableViewが応答しなくなり(テーブル内の他の項目にスクロールできなくなります)、ダウンロード後もdidSelectRowAtIndexPathはtheUITableViewを基本的にロックしたものをクリックします。

私の質問は、正しくrunLoopを実行しましたか?

他の方法があることは知っていますが、他の理由からこの一般的な方法を使用して行う必要があります。あなたがダウンロードしたり、テーブルビューのdidSelectRow方法で、他の潜在的に長い活動をしようとするべきではありません

おかげ

+2

これはひどい方法です。あなたの「他の理由」は何ですか? –

+0

はい私はそれが最良の方法ではないことを知っていますが、他の多くの理由のために現時点で変更することはできません....しかし、この方法を使用して問題を解決する方法はありますか?ありがとう –

答えて

1

。 UIをロックアップしないように非同期ダウンロードを設定した後、このUIメソッドから終了します(戻ります)。

同時ダウンロードのロックアウトは問題ありませんが、エラーまたはタイムアウト後に状態をリセットするように注意してください。

+0

+1 iOSはまさにこの理由のために非同期ダウンロードのための強力なメカニズムを提供します。非HTTPプロトコルを使用している場合、CocoaAsyncSocketは、任意のネットワークプロトコルを処理するための優れたフレームワークを参照してください。 –

+0

ああ、申し訳ありません、それは古いコードでした。現在の動作は次のとおりです。 –

+0

- (void)downloadItem(....) { BOOL downloading = TRUE; callFunctionsToStartdownload(...); // while(ダウンロード中){ downloading = DownloadSomeBytes(...); CFRunLoopRunInMode(kCFRunLoopDefaultMode、0.5、YES); }} –

関連する問題