2011-02-11 45 views
7

我有一個UITableView的項目列表,每個項目都有它自己的圖像。我認爲Apple的LazyTableImages示例項目將是完美的學習,並且用於實現在原始列表數據被檢索之後異步下載圖像的相同類型的過程。關於Apple的LazyTableImages示例的問題 - 不像應用商店的行爲

大部分情況下,它工作得很好,除非我注意到此示例應用程序與實際應用商店下載圖像的行爲之間存在細微差異。

如果啓動LazyTableImages示例,然後快速輕彈向下滾動,您將看到圖像不會顯示,直到滾動完成停止。

現在,如果您使用實際應用商店中的商品列表進行同樣的測試,即使滾動尚未停止,您會看到只要新商品進入視圖,圖像就會開始顯示。

我試圖實現這些相同的結果,但到目前爲止我沒有取得任何進展。有沒有人有任何想法如何做到這一點?

謝謝!

回答

10

我感到困惑的是,沒有人能回答這個問題......

所以,我終於想通了如何acheive的確切同樣是在實際的應用程序商店來如何的圖標效果,問候被下載/顯示。

取LazyTableImages示例項目並進行一些簡單的修改。

  1. 轉到到根視圖控制器和刪除關於所有的檢查是表滾動和/或在減速的cellForRowAtIndexPath

  2. 刪除以loadImagesForOnScreenRows所有呼叫,因而去除方法爲好。

  3. 進入IconDownload.m並將startDownload方法更改爲而不是做一個異步圖像downlaod,而是在後臺線程上執行同步下載。刪除startDownload所有的代碼,並添加以下,所以它看起來是這樣的:

 

- (void)startDownload 
{ 
    NSOperationQueue *queue = [NSOperationQueue new]; 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage) object:nil]; 

    [queue addOperation:operation]; 

    [operation release]; 
    [queue release]; 
} 
 

然後,添加一個的LoadImage,像這樣:

 

- (void)loadImage 
{ 
    NSData *imageData = [[NSData alloc] initWithContents OfURL:[NSURL URLWithString:appRecord.imageURLString]]; 
    self.apprecord.appIcon = [UIImage imageWithData:imageData]; 
    [imageData release]; 

    [self performSelectorOnMainThread:@selector(notifyMainThread) withObject:nil waitUntilDone:NO]; 
} 
 

然後,添加notifyMainThread這樣:

 

- (void)notifyMainThread 
{ 
    [delegate appImageDidLoad:self.indexPathInTableView]; 
} 
 

完成!運行它,你會看到確切的應用商店行爲,沒有更多的等待請求圖像下載,直到滾動停止,並沒有更多的等待圖像顯示,直到滾動停止,或直到用戶從屏幕上移除他們的手指。

只要單元準備好可以顯示圖像,下載圖像就會立即顯示圖像。

對不起任何錯別字,我沒有從我的應用程序無論如何粘貼此,我輸入它,因爲我現在從我的MAC很遠......

,我希望這可以幫助大家。 ..

0

退房UIScrollViewDelegate。我通過偵聽scrollViewDidScroll:,計算滾動速度(通過檢查contentOffset與上次記錄的contentOffset,除以時間差),並在速度降到某個閾值以下時開始加載圖像來實現類似這樣的事情。 (你也可以用UIScrollViewDelegate的scrollViewDidEndDragging:willDecelerate:來實現類似的功能)。

當然,你不必檢查速度;只要你看到一個新的單元格,你就可以在UITableViewDelegatetableView:willDisplayCell:forRowAtIndexPath:上加載圖像,但是我發現如果用戶翻轉了大量的單元格,你不需要費心,直到你看到他們會慢下來下來瀏覽。

+0

我試過這個。我已經確認,下載新顯示的項目圖像的調用立即發生。但是,connectionDidFinishLoading:直到滾動完成停止纔會被調用。我很困惑這種行爲... – bpatrick100 2011-02-11 01:40:48

+0

另一種描述示例應用程序行爲的方式是,如果你向上滑動列表,但不釋放你的手指(保持在屏幕上),你會看到圖像不顯示。然後,只要鬆開手指,圖像就會顯示出來。這看起來像單線程行爲。我想知道這是否是整個問題。我想知道是否需要明確地將每個圖像下載調用放到他們自己的線程中... – bpatrick100 2011-02-11 01:46:37