2009-07-04 15 views
2

データの長いリストを表示するUITableViewがあります。セクションを使用し、How to solve slow scrolling in UITableViewの摂取に従ってください。UITableViewの読み込みが遅い。なぜ知っていますか?

フローはメインUITableView &からローを選択してプッシュします。

ただし、3000個のアイテムを表示するには11秒かかります。私はsqlite(私は最初の200をプリロードする)からのレコードの負荷からまず疑いがあります。だから私はそれを50にカットしました。

しかし、私は1または500だけをプリロードしても、時間は同じです。

ビューはIBから作成され、すべてが不透明です。

問題を検出する方法が不足しています。私はインストゥルメントツールを実行しますが、見えるものはわかりません。

また、以前のUITableからセルを選択した場合、しばらくの間、視覚的なフィードバックは表示されません(つまり、セルが選択されない)ので、何も選択しないでください。この問題に関連しています。

どうすればよいですか?

注:

  • iPod touchの2D世代
  • キャッシュ
  • ためNSDictionaryのを使用してのviewDidLoad
  • でキャッシングを行うのsqlite API
  • としてFMDB使用:問題は、実際のデバイスであります
  • キャッシュ部分にNSAutoreleasePoolを使用する。のみ& MAC 4フィールドはUIViewのインターフェイスビルダーで作ら
  • セルのデータを表示するnecesary行IDをキャッシュ
  • 、SDK 2.2.1
  • インスツルメンツは、私は、デバイスに
+0

私はInstrumentsをもう一度見ていますが、最もexpesiveな呼び出しはfmresultsetです(fdbmライブラリから) – mamcx

+0

データを取得するSQLクエリを実行するのにかかる時間を分析しましたか? – teabot

+0

どのように考えていますか。以前はSQL Serverを使用していましたが、これはsqliteではなくツールを使用していることを知っています – mamcx

答えて

2

2.5メガバイトを使用して言います - [FMResultSet next]コールは、読み込み中のデータに応じて、非常に高価な呼び出しを行うことができます。この呼び出しの間、sqliteは実際にデータベースに行き、返す次の行を見つけて、適切なフィールドを返します。それは単なる列挙者ではない。

実際にテーブルを表示する前に、すべてのデータをプリキャッシングすることを検討してください。これは、テーブルが画面に表示される前に、すべてのFMDBコールを実行することを意味します。

時間がかかる場合は、テーブルビューに最初の行を表示してから、NSOperationsまたは2番目のスレッドを使用してバックグラウンドでデータをロードし、キャッシュすることができます。

+0

私はすでに最初の200レコードをキャッシュしていますが、すべてのIDをロードする必要があります。 バックグラウンドでこれを行うにはどうすればいいですか? – mamcx

+0

には、あなたのキャッシュにすべてをロードしてから、[NSThread detachThreadSelector:@selector(myCachingMethod)toTarget:self withObject:nil]を呼び出すメソッドがtableViewControllerにあります。 また、実際には、キャッシュを表示する際にキャッシュを使用することを忘れないでください。 –

+0

しかし、残念ながら私はスレッドの問題を抱えています。(私はそれを使用する両方のトレッドでsqliteをどのように使用するのかわかりません。 anoter SOの質問... – mamcx

0

コードを一切見ることなく、テーブルをインデックス化する必要があると思います。

あなたが照会する属性にインデックスを追加すると、非常に高速になるはずです。これは、CREATE INDEX SQLコマンドを使用して行うことができます。

関連する問題