2010-12-08 6 views
3

Я работаю над приложением iPhone, которое отображает уменьшенные изображения из контактов в UITableView.UITableView - Lazy loading contact images

Все очень быстро, пока я не включил миниатюры, тогда прокрутка будет очень медленной. Все остальные данные поддерживаются Core Data, и я попытался сохранить изображения в Core Data заранее, но это само по себе занимает слишком много времени запуска и менее гибкое и т. Д.

Что мне действительно нужно, это способ сделать поиск и предварительные миниатюры лениво с помощью отдельного потока или NSOperation и т. д., но я не уверен, каким будет самый простой способ добиться этого.

Проект образца Apple 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 

EDIT:

Как насчет:

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)