在UITableView或UICollectionView上获取加载的vs可见单元格

在UITableView或UICollectionView上获取加载的vs可见单元格,uitableview,uicollectionview,uicollectionviewcell,ios10,Uitableview,Uicollectionview,Uicollectionviewcell,Ios10,随着iOS 10的推出,我们似乎将有更多的用户。这意味着没有显示在屏幕上的单元格将在用户实际看到它们之前被提取 以下是一些相关的方法: : :如果单元格不可见,则返回“nil” :每个项目表示“表视图中的可见单元格” :每个项目表示“表视图中的可见行” : :“返回集合视图显示的可见单元格的完整列表。” :每个项表示“集合视图中的可见单元格” :如果单元格不可见,则返回“nil” 所有这些在他们的描述中都特别提到“可见”。随着iOS 10中引入预取功能,我如何区分预取的单元格和当前可见的

随着iOS 10的推出,我们似乎将有更多的用户。这意味着没有显示在屏幕上的单元格将在用户实际看到它们之前被提取

以下是一些相关的方法:

:

  • :如果单元格不可见,则返回“
    nil
  • :每个项目表示“表视图中的可见单元格”
  • :每个项目表示“表视图中的可见行”
:

  • :“返回集合视图显示的可见单元格的完整列表。”
  • :每个项表示“集合视图中的可见单元格”
  • :如果单元格不可见,则返回“
    nil
所有这些在他们的描述中都特别提到“可见”。随着iOS 10中引入预取功能,我如何区分预取的单元格和当前可见的单元格

换言之:

  • 如何获取所有可见单元格
  • 如何获取所有已加载的单元格
  • UITableView或UICollectionView上似乎没有任何新的API对此有所帮助。

    TL;博士

    • 按字面意思理解函数名中的
      可见
    • UITableView的行为与iOS 9中的行为相同
    • 如果您想在iOS 10上的UICollectionView中以不同的方式处理加载的单元格和可见单元格,则需要进行一些簿记

    在预取方面,UITableView和UICollectionView的行为似乎非常不同

    首先要注意的是,预取单元和预取数据之间存在差异:

    • 预取单元格指在单元格实际显示在屏幕上之前调用的
      cellForRowAtIndexPath
      。这将启用这样一种场景,即您的单元格处于屏幕外但仍处于加载状态
    • 预取数据指的是
      预取数据源
      方法,用于通知您将在屏幕上显示的
      indexpath
      。调用此方法时没有对单元格的引用,调用此方法时也没有返回单元格。相反,这种方法应该做一些事情,比如发出网络请求,下载将显示在单元格中的图像
    注意:在所有这些场景中,假设有8个单元格可以在任何给定时间显示

    UITableView:(选项:
    无预取
    ,或
    预取数据

    • 永远不会预取单元格。换句话说,它永远不会在未显示的
      indepath
      上调用
      cellforrowatinexpath
    • 因此,UITableView上没有
      isPrefetchingEnabled
      属性
    • 您可以使用
      prefetchDataSource
      选择预取数据
    • 请注意,尽管表视图看起来确实是,但当重用的单元格返回屏幕时,它似乎仍然调用了
      cellForItemAtIndexPath
      。(尽管我可能需要对此做更多的调查,尤其是对于集合视图。)
    UICollectionView:(选项:
    无预取
    预取单元格
    ,或
    预取单元格和数据

    • 默认情况下,预取单元格。换句话说,它将调用不立即显示的单元格的
      cellForItemAtIndexPath
    • 只有当用户在集合视图上向上或向下滚动时,单元格的预取才会开始。换句话说,在加载视图时,您将获得对
      cellForItemAtIndexPath
      的整整8个调用。只有当用户向下滚动时,才会开始要求显示不可见的单元格(例如,如果向下滚动显示2-10,则可能要求显示11-14)
    • 当预取的不可见单元格出现在屏幕上时,它不会再次调用
      cellForItemAtIndexPath
      。它将假定您第一次执行的实例化仍然有效
    • 您可以使用
      prefetchDataSource
      选择预取数据
    • prefetchDataSource
      只对初始加载有用。在上面相同的场景中,当显示前8个单元时,例如,它可能触发单元9-14的数据预取。然而,一旦调用了这个初始方法,以后就没有用了。这是因为每次调用
      prefetchItemsAt
      后都会立即调用
      cellForItemAtIndexPath
      。例如,您将获得
      prefetchItemsAt:[14,15]
      ,紧接着是
      cellForItemAt:14
      cellForItemAt:15
    • 通过设置
      isPrefetchingEnabled=false
      ,可以选择退出所有预取行为。这意味着您不能使UICollectionView的行为与具有
      预取数据源的UITableView类似。或者,换句话说,您不能仅拥有UICollectionView
      预取数据
    对于这两种情况

    • visibleCells
      InExpathsForVisibleRows
      cellForItemAtIndexPath
      的操作与它们所说的完全一样:它们只处理可见单元格。在我们相同的场景中,如果我们加载了20个单元格,但只有8个单元格在屏幕上可见。所有3种方法都只报告8个屏幕单元格
    那么这意味着什么呢


    • 如果您使用的是UITableView,您可以按原样使用它,而不必担心加载单元格与可见单元格之间的差异。它们总是等价的
    • 另一方面,对于UICollectionView,如果您关心这个差异,您需要做一些簿记来跟踪加载的、不可见的单元格与可见的单元格。您可以通过查看数据源上的一些方法和委托方法(例如willDisplayCell、DiEndDisplayingCE)来完成此操作