2016-08-25 56 views
16

随着iOS 10的推出,看起来我们将要有prefetching enabled by default on UITableView and UICollectionViews。这意味着屏幕上未显示的单元格将在用户实际看到它们之前获取。在UITableView或UICollectionView上获取加载vs可见单元格

这里有一些相关的方法:

UITableView

UICollectionView

所有这些在他们的描述中特别提及“可见”。随着iOS 10中预取的引入,我将如何区分预取的单元格和当前可见的单元格?

换句话说:

  1. 我如何获得所有可见的单元格?
  2. 如何获取所有已加载的单元格?

它看起来不像UITableView或UICollectionView上有任何新的API可以帮助解决这个问题。

+0

有一个新的协议'UITableViewDataSourcePrefetching'为'UITableView' iOS中10我写了一篇关于它和做一些测量:https://andreygordeev.com/2017/02/20/uitableview-prefetching/ –

回答

22

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 prefetchingprefetch 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

对于这两种

  • visibleCellsindexPathsForVisibleRowscellForItemAtIndexPath做,正是因为他们说:他们只处理可见细胞。在我们的相同情况下,如果我们有20个单元格加载,但只有8个可见在屏幕上。所有这三种方法都只会报告8个屏幕单元。

那么这是什么意思?

  • 如果您使用的是UITableView,您可以按原样使用它,并且永远不必担心加载与可见单元格之间的差异。它们总是等同的。
  • 对于UICollectionView,另一方面,如果您关心这种差异,则需要做一些记录以跟踪装载的,不可见的细胞与可见细胞。您可以通过查看数据源和委托方法的某些方法(例如,willDisplayCell,didEndDisplayingCell)来执行此操作。
+0

“如果你使用的是UITableView,你可以直接使用,不必担心加载与可见单元格之间的区别,它们总是等价的。”_cells_的确如此。问题是_data_。当表格视图第一次出现时,'prefetchRowsAt'对最初可见的行不被调用__。那么你应该如何获取这些行的数据而不重复所有的代码呢?我认为这是一个严重的错误。我看到如何解决它,但我不应该。这些行应该是list_上的_first用于预取 - 而它们不是。 – matt

相关问题