2

SQLite データベースに約 2000 行あります。各行には、整数 ID と文字列値があります。連絡先アプリのように、アルファベット順のインデックスを使用して UITableView に入力したいと思います。

CoreData を使用せずに連絡先アプリと同等のパフォーマンスを達成することは可能ですか? CoreData が行うすべてのこと (キャッシュなど) を再実装する必要はありませんか?

ページあたり50行のページングを使用してこれを実装し、テーブルビューが25行を超えてスクロールしたときに別のスレッドで次のページをプリロードしようとしました。これは、スクロールがそれほど速くない場合は機能しますが、スクロールが非常に速い場合はまだ遅くなります。50 項目の一時的な NSArray を設定する手順に時間がかかっていると思います。

さらに、このアプローチは UITableView のインデックスにはうまく機能しません。これは、インデックスがスキップするのに対し、読み込みは順次行われるためです。初期化時に各インデックス キーの最初の 10 行をロードすることを考えましたが、やはり非常に遅くなります (260 項目を配列に入力する)。

助言がありますか?

4

2 に答える 2

0

一度に数千行をフェッチするパフォーマンスは大したことではないようです (それらをプリフェッチできるはずです)。

必要な列(参照用のインデックスや表示される文字列など)に対してテーブルで非同期に SELECT を実行し、それらをNSMutableDictionaryインデックスのキーにスローしてから、テーブルデータをリロードします。関数はこのcellForRowAtIndexPath UITableViewDataSource辞書を使用します。

ユーザーが行を選択して詳細を表示できるようにすると、選択時にその行の残りのデータに対してクエリを実行できます。

ViewDidLoadまたはで初期フェッチを非同期にViewWillAppear実行すると、ユーザーがテーブルを表示しようとしたときに UI がロックされるのを防ぐことができます。ほとんどの場合、テーブルが実際に表示されると、テーブルはすでに表示されているはずです。

初期フェッチ (バックグラウンド スレッドで実行され、続いてメイン スレッドでテーブルがリロードされます)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^()
               {
                    //perform your query here
                   dispatch_async(dispatch_get_main_queue(), ^()
                                  {
                                    [self.tableView reloadData]
                                  });
               });
于 2012-05-21T19:43:58.070 に答える
0

私はAZのみの例を取っ​​ています

表の 26 セクションを取ります。

データを取得するためのクエリが 26 あります。最初に A から開始するため、2 番目に B から開始するため、3 番目に C から開始するため、そして cellForRowAtIndexPath() で Z までを開始します。

ユーザーがテーブルをスクロールしない限り、他のアルファ ベットのデータは取得されません。

A から Z までのそれぞれに 100 個の名前 (テキスト) が含まれている場合。

それでも時間はかかりません。

ここからアイデアを得られることを願っています..

于 2012-05-21T20:10:24.317 に答える