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/ –