2016-08-25 8 views
16

iOS 10の導入により、prefetching enabled by default on UITableView and UICollectionViewsがあるようです。つまり、画面に表示されないセルは、実際に表示される前にフェッチされます。ここUITableViewまたはUICollectionViewで読み込まれたセルと可視セル

いくつかの関連する方法である: "セルが表示されていない場合nil。" 戻り値:

UITableView

UICollectionView

  • visibleCells: "コレクションビューで表示される可視セルの完全なリストを返します。"
  • indexPathsForVisibleItems:各アイテムは、「コレクションビューの可視セル」を表します。
  • cellForItemAtIndexPath::セルが表示されていない場合は "nil"を返します。

これらのすべては、特にその説明で「見える」に言及。 iOSの10でプリフェッチの導入により、どのように私は、現在表示されている1対プリフェッチされたセルを区別するのでしょうか?言い換えれば

  1. がどのように私はすべての可視セルを得るのですか?
  2. どのように私はすべてのロードされた細胞を得るのですか?

これに役立つUITableViewまたはUICollectionViewのいずれかに新しいAPIがないように見えます。

+0

新しいプロトコル私はそれについて記事を書いて、いくつかの測定を行ったiOSの10にUITableView' ''ためUITableViewDataSourcePrefetching'があります:https://andreygordeev.com/2017/02/20/uitableview-prefetching/ –

答えて

22

TL; DR

  • は、文字通り、関数名にvisibleしてください。
  • のUITableViewは、それがiOSの9でやったように振る舞う
  • あなたは10

のiOS上UICollectionViewで異なる可視セル対ロード扱いたい場合は、いくつかの簿記を行う必要がありますUITableViewとUICollectionViewは、それがプリフェッチに来るとき非常に異なる動作をするように見えます。注目すべき

最初のものはプリフェッチ細胞とプリフェッチデータの差があることである:

  • プリフェッチ細胞は、細胞が実際に画面上に表示される前に呼び出されるcellForRowAtIndexPathを指します。これにより、オフスクリーンであるがまだロードされているセルがあるシナリオが可能になります。
  • プリフェッチデータは、画面に表示されるindexPathsについて通知するprefetchDataSourceメソッドを参照しています。このメソッドが呼び出されたときにセルへの参照がなく、このメソッドが呼び出されたときにセルを返さない。代わりに、このメソッドは、セルに表示される画像をダウンロードするネットワーク要求を起動するなどの処理を行う必要があります。

注:これらのすべてのシナリオでは、任意の時点で表示できるセルが8つあるとします。

のUITableView:(オプション:no prefetching、またはprefetch data

  • はこれまで、細胞をプリフェッチしません。つまり、表示されていないindexPathにはcellForRowAtIndexPathは決して呼び出されません。
  • したがって、UITableViewにはisPrefetchingEnabledというプロパティはありません。
  • データのプリフェッチをprefetchDataSourceで行うことができます。
  • テーブルビューはless aggressive with reusing cellsのように見えますが、再利用されたセルが画面に戻ったときにもcellForItemAtIndexPathを呼び出すように見えます。 (私は特にコレクションビューのために、これまでのようにいくつかのより多くの調査を行う必要があるかもしれないが。)

UICollectionView:(オプション:no prefetchingprefetch cells、またはprefetch cells and data

  • プリフェッチ細胞をデフォルトではつまり、直ちに表示されないセルに対してはcellForItemAtIndexPathを呼び出します。
  • セルのプリフェッチは、ユーザーがコレクションビューを上下にスクロールするときにのみ開始されます。言い換えれば、ビューがロードされたときに、cellForItemAtIndexPathに正確に8回の呼び出しを行います。ユーザーが一度スクロールすると表示されないセルが表示されます(たとえば、スクロールして2-10を表示すると、11-14が表示される)。
  • プリフェッチされた非表示のセルが画面に表示されると、cellForItemAtIndexPathを再度呼び出すことはありません。あなたが最初にやったインスタンス化がまだ有効であると仮定します。
  • データのプリフェッチをprefetchDataSourceで行うことができます。
  • prefetchDataSourceは、最初の負荷にのみ役立つことが分かります。上記の同じシナリオでは、最初の8つのセルが表示されると、たとえば、セル9〜14のデータのプリフェッチを起動することがあります。しかし、いったんこの初期メソッドが呼び出されると、その後は役に立たない。これは、prefetchItemsAtの各呼び出しの直後にcellForItemAtIndexPathが呼び出されるためです。たとえば、prefetchItemsAt:[14, 15]の直後にcellForItemAt:14cellForItemAt:15が続きます。
  • すべてプリフェッチの動作をisPrefetchingEnabled = falseに設定することができます。つまり、UICollectionViewをUITableViewと同様に動作させることはできません(prefetchDataSource)。つまり、UICollectionView prefetch dataのみを持つことはできません。

    • visibleCellsindexPathsForVisibleRows、そして彼らが言うようにcellForItemAtIndexPathが正確に実行します:彼らは唯一見える細胞を扱う両方については

    。同じシナリオでは、20個のセルが読み込まれていますが、8個しか表示されません。これら3つの方法のすべては、8つのオンスクリーン細胞についてのみ報告する。

これはどういう意味ですか?

  • UITableViewを使用している場合、そのまま使用することができ、ロードされたセルと表示されているセルの違いについて心配する必要はありません。それらは常に同等です。
  • UICollectionViewでは、この違いが気になる場合は、読み込まれた非表示のセルと表示されているセルを追跡するために、いくつかのブックキープを行う必要があります。これを行うには、データソースとデリゲートメソッドのいくつかのメソッドを調べます(willDisplayCell、didEndDisplayingCellなど)。
+0

「UITableViewを使用している場合は、そのまま使用することができ、ロードされたセルと表示されているセルの違いについて心配する必要はなく、常に同じです。問題は_data_です。テーブルビューが最初に現れると、最初に見える行に対して 'prefetchRowsAt'が呼び出されません。では、コードをすべて複製せずに、これらの行のデータをどのようにフェッチするのですか?私はこれを深刻なバグとみなしています。私はそれを回避する方法を見ますが、私はする必要はありません。これらの行は、最初にリスト_上でプリフェッチする必要があります - そうではありません。 – matt

関連する問題