TL; DR
- 以使用功能名称的字面
visible
。
- UITableView的行为就像在iOS中9.做
- 你需要做一些簿记,如果你想治疗在UICollectionView不同方式加载对比可见细胞iOS上的10
当涉及到预取时,UITableView和UICollectionView表现出非常不同的表现。
注意到的第一件事是,有细胞和预取数据预取之间的差异:
- 预取单元指
cellForRowAtIndexPath
之前,屏幕实际显示的细胞中被调用。这使您可以在屏幕外但仍然加载单元的情况下使用。
- 预取数据参考
prefetchDataSource
方法告知您将要在屏幕上显示的indexPaths
。调用此方法时没有对单元格的引用,并且在调用此方法时不返回单元格。相反,此方法应该执行诸如发出网络请求以下载将显示在单元格中的图像之类的内容。
注意:在所有这些场景中,假设有8个单元可以在任何给定时间显示。
的UITableView:(选项:no prefetching
,或prefetch data
)
- 不预取细胞,永远。换句话说,它不会在没有显示的
indexPath
上调用cellForRowAtIndexPath
。
- 因此,在UITableView上没有
isPrefetchingEnabled
属性。
- 您可以选择使用
prefetchDataSource
预取数据。
- 请注意,尽管表格视图看起来似乎是less aggressive with reusing cells,但当重新使用的单元格返回到屏幕上时,它似乎仍然调用
cellForItemAtIndexPath
。 (虽然我可能需要做更多的调查,以了解这一点,特别是对收集的意见。)
UICollectionView:(选项:no prefetching
,prefetch cells
,或prefetch cells and data
)
- 预取细胞默认。换句话说,它将为不会立即显示的单元呼叫
cellForItemAtIndexPath
。
- 单元的预取只在用户在收集视图上向上或向下滚动时开始。换句话说,当加载视图时,您将收到8个对
cellForItemAtIndexPath
的调用。只有当用户向下滚动时,才会开始询问不可见的单元格(例如,如果向下滚动以显示2-10,则可能要求11-14)。
- 当预取的不可见单元格出现在屏幕上时,它不会再次调用
cellForItemAtIndexPath
。它会假设你第一次实例化仍然有效。
- 您可以选择使用
prefetchDataSource
预取数据。
prefetchDataSource
原来只对初始负载有用。在上面的相同场景中,例如,当显示前8个单元时,它可以触发预取单元9-14的数据。但是,一旦调用了这个初始方法,此后就没用了。这是因为cellForItemAtIndexPath
将在每次致电prefetchItemsAt
后立即致电。例如,您将立即获得prefetchItemsAt:[14, 15]
,cellForItemAt:14
,cellForItemAt:15
。
- 您可以选择退出全部通过设置
isPrefetchingEnabled = false
预取行为。这意味着您无法使UICollectionView的行为与具有prefetchDataSource
的UITableView类似。或者换句话说,您不能只有UICollectionView prefetch data
。
对于这两种:
visibleCells
,indexPathsForVisibleRows
和cellForItemAtIndexPath
做,正是因为他们说:他们只处理可见细胞。在我们的相同情况下,如果我们有20个单元格加载,但只有8个可见在屏幕上。所有这三种方法都只会报告8个屏幕单元。
那么这是什么意思?
- 如果您使用的是UITableView,您可以按原样使用它,并且永远不必担心加载与可见单元格之间的差异。它们总是等同的。
- 对于UICollectionView,另一方面,如果您关心这种差异,则需要做一些记录以跟踪装载的,不可见的细胞与可见细胞。您可以通过查看数据源和委托方法的某些方法(例如,willDisplayCell,didEndDisplayingCell)来执行此操作。
有一个新的协议'UITableViewDataSourcePrefetching'为'UITableView' iOS中10我写了一篇关于它和做一些测量:https://andreygordeev.com/2017/02/20/uitableview-prefetching/ –