6

ユーザーがタイプするにつれて、私はバックグラウンドスレッドでローカルワードグラフを走査して結果(テキスト)を取得しています。各キーストロークは前の操作をキャンセルします。操作が完了すると、データソースが更新され、reloadDataがメインスレッドで呼び出されます。数万の結果が返ってきた場合でも、これは素晴らしい結果をもたらし、非常に高速です(ユーザーが入力できる限り速い)。カスタムセルサイズのUICollectionViewのパフォーマンスを向上させるにはどうすればよいですか?

各コレクションビューセルのサイズをカスタマイズするために、UICollectionViewDelegateFlowLayoutデリゲートのsizeForItemAtIndexPathを実装しました。残念なことに、これは、ユーザーが入力するときに、小さくても目立つラグを生じます。私のサイズ計算ロジックで時間が失われていないことを確かめるために、私は固定サイズを返そうとしましたが、それでもパフォーマンスは犠牲になりました。私はこれに驚いています。なぜなら、いつでも画面上に120個程度の細胞しかないからです。このメソッドをコメントアウトすると、非常に大きなデータセットであっても、応答時間は直ちに戻ります。

カスタムセルサイズのUICollectionViewのパフォーマンスを改善するためのアイデアはありますか?

おかげ

追加の明確化...

プログラムは、文字の特定のセットからすべての可能な単語は、ユーザーの種類としてスコアやアルファベット順などでソートを返し、総単語数が上がります高速(複数のワイルドカードが入力された場合、指数関数的に)。入力時にワードが変化するので、セルの幅はそれに応じて更新され、フローレイアウトによって処理されるように次の行にラップされます。

問題は、いつでも画面に表示されるセルの数のようです。 sizeForItemAtIndexPathでは、1つまたは2つのセルしか表示されない大きなサイズが返された場合、更新は非常に高速です。しかし、私がテキストにちょうど合うサイズを返すと、私は100以上の目に見える細胞で終わり、遅れがあります。 sizeForItemAtIndexPathをコメントアウトして固定サイズのセルを使用するだけで高速ですが、それは私が行っていることではありません。

+0

タイピング中にセルのサイズを変更したい、またはカスタムサイズを固定したいですか? –

+0

なぜ画面上のセルを更新するのではなく、 'reloadData'を呼び出すのかを理解しようとしています。 –

+0

上記で追加された追加の説明...ユーザーの種類に応じてセルの幅が変更されます。 reloadDataを呼び出さずにこれをどうすればできますか? – Bama91

答えて

2

あなたは代わりに使用することができ、reloadDataを呼び出すことによってUICollectionViewをリロードする必要はありません。ここで

[self.collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]]; 

は、indexPathは更新したい対応UICollectionViewCellオブジェクト ためNSIndexPathオブジェクトです。

+0

insertItemsAtIndexPathsまたはreloadItemsAtIndexPathsを使用してデータをループするというアイデアは、NSOperationがキャンセルされた(つまり、ユーザーが新しい文字を入力した)かどうかを確認する機会を与えてくれました。これまでのところ、私はこれを動作させることができませんでした。私は今夜​​また試してみます... – Bama91

+0

私はそれを理解しているので、レイアウト全体がリフローしているので、選択したアイテムをリロードするだけではいけません。実際にレイアウトを無効にする必要があります。 –

+0

すべてのキーストローク(セルの幅を含む)でデータソース全体(ワードリスト)が変更されていることを考えると、reloadDataの実行を避ける方法はまだありません。 私のプログラムの一般的な流れは次のとおりです。1. textDidChangeはすべての操作をキャンセルします。2. NSOperationをキューに追加します(同時に1つだけ)。3.操作は、バックグラウンドで文字から単語を見つける方法を呼び出します。見つけられた単語でデータソースを更新します(キャンセルされていない場合)。5 reloadDataがメインスレッド上にあります(キャンセルされていない場合)。 – Bama91

関連する問題