6

ユーザーが入力すると、バックグラウンド スレッドでローカル ワード グラフをトラバースして結果 (テキスト) を取得します。各キーストロークは前の操作をキャンセルします。操作が完了すると、データ ソースが更新され、メイン スレッドで reloadData が呼び出されます。これはうまく機能し、何万もの結果が返される場合でも非常に高速です (ユーザーが入力できるのと同じくらい高速です)。

各コレクション ビュー セルのサイズをカスタマイズするために、UICollectionViewDelegateFlowLayout デリゲートの sizeForItemAtIndexPath を実装しました。残念ながら、これにより、ユーザーが入力するときに、わずかではあるが顕著な遅延が発生します。サイズ計算ロジックで時間が失われていないことを確認するために、固定サイズを返そうとしましたが、それでもパフォーマンスが低下しました。画面には常に約 120 個のセルしかないため、これには驚いています。このメソッドをコメント アウトすると、非常に大きなデータ セットの場合でも、応答時間が再び短縮されます。

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

ありがとう

追加の説明...

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

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

4

1 に答える 1

2

UICollectionViewを呼び出してリロードする必要はありませんreloadData。代わりに以下を使用できます。

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

indexPathは、更新する対応するオブジェクトのオブジェクトですNSIndexPathUICollectionViewCell

于 2013-08-27T10:08:14.140 に答える