私はiPadアプリを書いていて、uiの応答性/ロックアップに問題があります。RunLoop with UITableViewロックアップ
私はUITableViewアイテムをクリックすると、インターネット上に出てそのアイテムを取り出して表示します。残りのプログラム(図示せず)はダウンロードされたアイテムを使用するので、一度に1つのアイテムしかダウンロードすることができない。
アイテムを取得するのに時間がかかることがあります。その間、ユーザーはUITableViewをスクロールすることはできますが、クリックされた前の項目がダウンロードされるまでは何も選択できないようにしたいと考えています。
これはスレッド、ブロック、コールバックを使用して行うことができますが、今私はそれを行う時間がありません(不可能な時間制約)。
私は簡単な方法は、順次、それをダウンロードして実行するループと、この2段階のプロセスのようなフラグを使用するだろうと思った:
テーブルセルのdidSelectRowAtIndexPath上のユーザーがクリックが呼び出される、そこに私はグローバルフラグを設定し、ダウンロードメソッドを呼び出してアイテムをダウンロードします。 。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { static BOOL alreadyInHere=FALSE; if (alreadyInHere) return; alreadyInHere=TRUE; .... downloadItem(...); ShowAndUseItem(...); alreadyInHere=FALSE; }
これにより、ユーザは一度に一つのアイテムを選択することができます:ユーザーが別の項目をクリックすると、ダウンロードが完了する前に(、それはフラグをチェックし、何もダウンロードせずに機能を終了基本的にこれが表示されます。
は、ユーザーがまだ長いダウンロード中の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方法で、他の潜在的に長い活動をしようとするべきではありません
おかげ
これはひどい方法です。あなたの「他の理由」は何ですか? –
はい私はそれが最良の方法ではないことを知っていますが、他の多くの理由のために現時点で変更することはできません....しかし、この方法を使用して問題を解決する方法はありますか?ありがとう –