- ベストアンサー
UITableViewの処理速度について
- UITableViewの処理速度について質問です。
- SLRequestを使いSNSからデータを取得し、UITableViewで表示しています。非同期で通信しているので、numberOfSectionsInTableViewやnumberOfRowsInSectionは数ミリ秒で処理されますが、cellForRowAtIndexPathに入るまでに数十秒かかってしまいます。
- 具体的には、データを取得し配列にセットしてからテーブルビューをリロードする処理までが遅く、その原因がわかりません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
このログからすると、numberOfRowsInSectionの中の処理で 時間がかかっているんじゃないかなと思いました。 numberOfRowsInSectionの最後にログを入れると、 そのあたりがはっきりすると思います。 SNS系のAPIはあまり使用したことないので、かなりあてずっぽうですが、 numberOfRowsInSectionで全体のテーブルサイズを得るために、 同期的に全データを読み込むようなAPIを呼び出したりしてないでしょうか? numberOfRowsInSectionで返すテーブルサイズは、今読まれている データのサイズを返すようにし、非同期に読み込みが完了する たびにnumberOfRowsInSectionが返す値を増やすような設計に していればうまくいくんじゃないかなと思いました。 以上、詳しい処理方式が説明されてないので、勝手な想像での アドバイスです。 あと、どのスレッドが時間を使っているかわからないとのこと ですが、今回のようなケースだと、数十秒の時間がかかっている 時に、デバッグエリアの実行中断/再開ボタンで実行を一時中断させ、 その時のコールスタックの状態を調べれば、何が動いているか わかると思います。 (参考) Debug AreaのExecution control button https://developer.apple.com/library/mac/recipes/xcode_help-debugger/articles/about_debug_area.html Debug Navigatorのcall stacks https://developer.apple.com/library/mac/recipes/xcode_help-debug_navigator/articles/about_debug_navigator.html
お礼
いつもご解答、本当にありがとうございます。 numberOfRowsInSection では、配列の数を、そのまま返していたので処理に時間はかかっておりませんでした。 >非同期に読み込みが完了する >たびにnumberOfRowsInSectionが返す値を増やすような設計に >していればうまくいくんじゃないかなと思いました。 今回は、取得する件数が少ないため一度に、返していましたが 今後、件数の多いテーブルビューを使う時は、このような設計で行きたいと思います。 教えて頂きました方法で、コールスタックの状態を調べたところ performRequestWithHandler での処理が終わっていないことが解りました。 根本的な解決にはなっていませんが、テーブルビューのリロード処理の スレッドを分けたところ問題なく動くようになりました。 開発自体は仕事で行っているのですが、スマホアプリは独学の趣味でして、こういうアドバイスは本当にありがたいです。 本当に、ありがとうございました。