UITableView - Ленивая загрузка изображений контактов - PullRequest
3 голосов
/ 08 декабря 2010

Я работаю над приложением для iPhone, которое отображает миниатюрные изображения из контактов в UITableView.

Все очень быстро, пока я не включаю миниатюры, затем прокручивается очень медленно.Все остальные данные поддерживаются 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();

        }

Огромное спасибо всем, кто имеет какие-либо полезные советы или код для выполнения этого простым и элегантнымпуть.

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Используйте этот метод.kABPersonImageFormat * Миниатюра *

(NSData*)ABPersonCopyImageDataWithFormat([targetPeople objectAtIndex:index], kABPersonImageFormatThumbnail)
1 голос
/ 23 апреля 2011

Если у вас уже есть 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 ;

    } ] ;

Если это все еще нестабильно (может быть), вы можете поставить в очередь изображения, которые необходимо применить к представлению таблицы в фоновом потоке, подождите, пока представление таблицы не перестанет прокручиваться, затем примените все ожидающие изменения изображения.

...