簡體   English   中英

在UICollectionView和UITableView中最佳地預加載/預取圖像

[英]Optimally preloading / prefetching images in UICollectionView and UITableView

我有一個我想象的非常常見的情況,我希望很容易解決 - 一個帶有UICollectionView的應用程序,每個單元格中的圖像通過http / https從Web服務器上的API獲取。

我正在嘗試在UICollectionView中實現iOS 10的預取 ,以便提前請求可能需要的圖像。

在我看來,最佳預取應滿足各種要求:

  1. 實際上立即需要的圖像的獲取應始終優先於推測預取,即使圖像已經在要獲取的隊列中。
  2. 當iOS告訴我們不再需要預取特定圖像時,應該從預取隊列中刪除它(並且只有它)。
  3. 如果請求圖像,則應始終傳送圖像,除非取消/全部/請求圖像(如果在多個單元格或多個視圖控制器中使用一個圖像,則容易出錯)。
  4. 如果調用didEndDisplaying,則應該中止優先獲取(但是,如果請求了預取但未取消,則圖像應該以較低的優先級留在隊列中)。
  5. 與圖像加載有關的各種常見要求 - 例如。 不要使用預取請求充斥底層系統,這些請求最終會使帶寬和服務器插槽遠離立即需要的映像。

我查看了各種現有的庫,如SDWebImageKingfisher ,並且很驚訝,似乎沒有任何方法可以輕松地使用任何一個庫來滿足上述要求。

例如,SDWebImage不符合第二個要求 - 您只能取消所有預取 ,或者必須為每個圖像創建一個預取程序(這意味着其他各種SDWebImage功能,例如限制預取圖像的並發請求數量) - 即要求5 - 不再有效。)

這真的是一個難題嗎? 我錯過了一些明顯的解決方案嗎 我是否過度思考要求?

如果從prefetchItemsAt indexPaths傳遞的最新索引路徑不夠,您似乎需要實現自己的優先級。

要求1,2,3使用優先級隊列(排序堆)完成。 要求4取決於您的優先級隊列的實施。 5是相當寬泛和模糊的,只是限制了你的方法的提取次數。 優先級隊列采用泛型類型,因此您可以將它與對象/類一起使用,該對象/類具有您要獲取的項目的屬性,下面我只使用IndexPath.row來簡化。

創建一個優先級隊列,用作數據源和緩存之間的中介。

然后通過查看/出列優先級隊列並存儲在Kingfisher中,將數據設置為從DataSource獲取。 您的DataSource - > PriorityQueue - > Kingfisher - > Cell

func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
     ...
    for indexPath in IndexPaths {
       //Add the indexPath to the top of the priority queue
       //highest priority is determined by the sort function you used when initializing the priority queue. 
       priorityQueue?.enqueue(indexpath.row)
    }

   //Call your method for getting the properties
   self.fetchObjectsByPriority() 
}


 func fetchObjectsByPriority() {
        if let count = priorityQueue?.count {
        for _ in 0...count {

            //get the index
            var index = self.priorityQueue?.dequeue()
            //Alternatively .peek() with out dequeuing item
            //get image data and store
            dataSource[index].image = ...

        }
    }
}

確保使用sort函數初始化優先級隊列。

您可以從此處獲得預構建的優先級隊列,您還需要一個來創建優先級隊列。

更多關於優先級隊列堆排序

如果沒有相關代碼,很難提供有效的解決方案。 我希望這會有所幫助,歡呼和祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM