2013-01-07 74 views
6

我有一個,每行有三張照片,使用UITableView實施。使用光盤上的成千上萬的圖像實現光柵捲動

我有一個內存緩存(使用NSCache),它具有100張圖像的容量,所以有一次我將在內存中存儲至多100張圖像,即使我有成千上萬張光盤上的圖像顯示網格。

我所有的圖像都是4KB-20KB的JPEG。

因此,使用此基礎架構時,用戶滾動瀏覽照片網格時,圖像會從NSCache連續加載和卸載。通常滾動一切看起來不錯,我得到55-58 fps左右。

當用戶開始滾動更快來回,我有兩種情況:

  1. 如果我單獨拿出從主線程的圖像加載任務,我結束了在照片網格圖像丟失,因爲我在將圖像讀入內存之前顯示單元格。

    (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
         UIImage *image = getImageFromCacheForImagePath:imagePath; 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          cell.leftGridItem.imageView.image = image; 
         }); 
        }); 
    } 
    
  2. 如果我在主線程上有圖像加載任務,就會出現口吃。我得到36-45fps左右。

    (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
        UIImage *image = getImageFromCacheForImagePath:imagePath; 
        cell.leftGridItem.imageView.image = image; 
    } 
    

getImageFromCacheForImagePath:imagePath立即獲取圖像從NSCache如果它存在,如果沒有,將圖像從文件加載並設置成NSCache供以後使用,但我設置的NSCache極限爲100

事情我試過/扭捏:

  1. 避免clipsToBounds電網圖像視圖。
  2. 在後臺線程中加載圖像。
  3. 使用NSOperation隊列。
  4. 以100個批次加載圖像(有效,但快速滾動,圖像加載時間延遲)。

我試圖達到與原生照片應用程序相同的感覺。

您的建議非常感謝。

+1

請檢查您的問題中的代碼。格式化需要幫助,並在完成後發現一些問題(請參閱代碼'^ {',它看起來應該開始一個新的代碼塊,但對我來說似乎不正確)。我們試圖幫助您將其格式化,但這並不明確。 – ErikE

+0

我不知道他們是不是像導入時間一樣離線生成縮略圖,然後縮略圖的小尺寸爲主線程加載提供了顯着的優勢。 –

回答

0

我幾天前還面臨同樣的問題,因此GitHub是搜索開源解決方案的最佳地點,因此請嘗試這些鏈接。

檢查PF-GridViewDTGridView

也拿上AQGridViewHow to Write a Custom Image Picker like UIImagePicker一看,

只需要根據我們的需要做到位manupulation和它的作品就像一個冠軍。

+0

感謝您的建議,所面臨的問題更多的是巧妙和及時地將圖像從光盤加載到內存,這樣我就不會佔用太多內存,但仍然可以在平滑滾動的網格視圖中顯示圖像。就像原生照片應用程序一樣,即使有數千張照片,它們也可以平滑滾動,就好像所有圖像都在內存中一樣。我想弄明白,他們是如何處理它的。 –

0

我已經實現了超過700張圖像的平滑滾動表。關鍵不僅是在後臺加載圖像,而且在後臺調整大小以完全適合容器。在UI線程中進行調整大小操作太重。