IOS 10の導入により、 ITableViewおよびUICollectionViewsでデフォルトでプリフェッチが有効になっている になるようです。これは、画面に表示されていないセルが、ユーザーに実際に表示される前にフェッチされることを意味します。
関連する方法は次のとおりです。
nil
」を返します。nil
」を返します。これらはすべて、説明の中で「目に見える」と具体的に言及しています。 iOS 10でのプリフェッチの導入により、プリフェッチされたセルと現在表示されているセルをどのように区別できますか?
言い換えると:
UITableViewまたはUICollectionViewのいずれかにこれを支援できる新しいAPIがあるようには見えません。
TL; DR
visible
を文字通り取ります。UITableViewとUICollectionViewは、プリフェッチに関しては非常に異なる動作をするように見えます。
最初に注意することは、プリフェッチセルとプリフェッチデータの間に違いがあることです。
cellForRowAtIndexPath
を指します。これにより、画面外にあるがまだロードされているセルがあるシナリオが可能になります。prefetchDataSource
について通知するindexPaths
メソッドを指します。このメソッドが呼び出されたときにセルへの参照がなく、このメソッドが呼び出されたときにセルを返しません。代わりに、このメソッドは、セルに表示される画像をダウンロードするためにネットワーク要求を起動するようなことを行う必要があります。注:これらすべてのシナリオで、いつでも表示できるセルが8つあると想像してください。
UITableView:(オプション:no prefetching
、またはprefetch data
)
cellForRowAtIndexPath
でindexPath
を呼び出すことはありません。isPrefetchingEnabled
プロパティはありません。prefetchDataSource
を使用して、データのプリフェッチにオプトインできます。cellForItemAtIndexPath
を呼び出すように見えることに注意してください。 (ただし、特にコレクションビューの場合は、これについてさらに調査する必要があるかもしれません。)UICollectionView:(オプション:no prefetching
、prefetch cells
、またはprefetch cells and data
)
cellForItemAtIndexPath
を呼び出します。cellForItemAtIndexPath
が正確に8回呼び出されます。ユーザーが下にスクロールすると、非表示のセルを要求し始めます(たとえば、下にスクロールして2-10を表示すると、11-14を要求する場合があります)。cellForItemAtIndexPath
を再度呼び出すことはありません。最初に行ったインスタンス化はまだ有効であると想定します。prefetchDataSource
を使用して、データのプリフェッチにオプトインできます。prefetchDataSource
は、初期ロードにのみ役立つことがわかりました。上記の同じシナリオでは、最初の8つのセルが表示されると、たとえば、セル9〜14のデータのプリフェッチが開始される場合があります。ただし、この最初のメソッドが呼び出されると、それ以降は役に立ちません。これは、cellForItemAtIndexPath
が呼び出されるたびにprefetchItemsAt
が呼び出されるためです。たとえば、prefetchItemsAt:[14, 15]
の直後にcellForItemAt:14
、cellForItemAt:15
が続きます。isPrefetchingEnabled = false
を設定することにより、allプリフェッチ動作をオプトアウトできます。これは、UICollectionViewをprefetchDataSource
を使用したUITableViewと同様に動作させることができないことを意味します。または、言い換えると、UICollectionView prefetch data
のみを持つことはできません。両方の場合:
visibleCells
、indexPathsForVisibleRows
、およびcellForItemAtIndexPath
は、彼らが言うとおりに機能します。つまり、visibleセルのみを処理します。同じシナリオで、20個のセルがロードされているが、画面に表示されるのは8個だけである場合。これらの3つの方法はすべて、画面上の8つのセルについてのみ報告します。では、これはどういう意味ですか?