随着iOS 10的推出,似乎我们将拥有prefetching enabled by default on UITableView and UICollectionViews。这意味着屏幕上未显示的单元格将在用户实际看到之前被提取。
以下是一些相关方法:
nil
。”nil
。”所有这些都在他们的描述中特别提到“可见”。随着在iOS 10中引入预取,我如何区分预取的单元格与当前可见的单元格?
换句话说:
看起来UITableView或UICollectionView上没有任何新的API可以帮助解决这个问题。
答案 0 :(得分:26)
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
来选择退出所有预取行为。这意味着您不能使UICollectionView的行为与具有prefetchDataSource
的UITableView类似。或者,换句话说,您不能只拥有UICollectionView prefetch data
。对于两者:
visibleCells
,indexPathsForVisibleRows
和cellForItemAtIndexPath
完全按照他们的说法完成:它们只处理可见单元格。在我们的相同场景中,如果我们加载了20个单元格,但屏幕上只能看到8个单元格。所有这三种方法都只会报告8个屏幕上的细胞。那是什么意思?