2010-12-08 92 views
3

我正在從UITableView中的聯繫人顯示縮略圖圖像的iPhone應用程序。UITableView - 延遲加載聯繫人圖像

一切都非常快,直到我打開縮略圖,然後它變得非常緩慢滾動。 所有其他數據都由Core Data提供支持,並且我嘗試將這些圖像預先保存在Core Data中,但這在啓動時本身需要很長時間,並且靈活性較差等。

我真正需要的是一種方法查找和準備縮略圖懶惰與單獨的線程或NSOperation等,但我不知道什麼最簡單的方法來完成這個。

蘋果的示例項目LazyTableImages如果圖片來自網絡,那麼它是非常棒的,可以肯定會適應,儘管我很難過。基本上問題是一樣的,但是從下載和網絡延遲等方面而不是時間滯後,我的延遲只是查找用戶通訊錄中圖片的時間。

這是在我的表格單元格的子類,我需要同時做任務:

 UIImage *contactImage = nil; 
     if (ABPersonHasImageData(person)) { 

     NSData *contactImageData = (NSData*)ABPersonCopyImageData(person); 
     UIImage *tempContactImage = [UIImage imageWithData:contactImageData]; 
     [contactImageData release]; 

     UIGraphicsBeginImageContext(CGSizeMake(45.0f, 45.0f));    
     [tempContactImage drawInRect:CGRectMake(0.0f, 0.0f, 45.0f, 45.0f)];   
     contactImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     } 

非常感謝的人誰擁有任何有用的提示或代碼在一個簡單而優雅的方式來做到這一點。

回答

1

如果你已經有一個UIImage,你爲什麼需要繪製contactImage?你可以直接使用tempContactImage,否?

一個良好的開端是簡單地做到這一點:

cell.imageView.image = tempContactImage 

編輯:

如何:

ABPersonRef person = ...get person... 
UITableViewCell * cell = ...get cell... 
[ [ NSOperationQueue mainQueue ] addOperation: 
    [ NSBlockOperation blockOperationWithBlock:^{ 
     if (ABPersonHasImageData(person)) { 
     ... 
     } 
     cell.imageView.image = contactImage ; 

    } ] ; 

如果這仍然不流暢(可能),你可以排隊需要將圖像應用於後臺線程中的表格視圖,等到表格視圖停止滾動,然後應用任何待處理的圖像更改。

+0

如果您正在繪製成contactImage只是擴展到適合45.0x45.0,你也可以只用上面的代碼,做cell.imageView.contentMode = UIViewContentModeScaleAspectFill – nielsbot 2011-04-23 07:34:18

1

使用此方法。 kABPersonImageFormat * 縮略圖 *

(NSData*)ABPersonCopyImageDataWithFormat([targetPeople objectAtIndex:index], kABPersonImageFormatThumbnail)