2016-08-25 55 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

相關問題