Вопрос об образце Apple LazyTableImages - не работает так же, как в магазине приложений - PullRequest
7 голосов
/ 11 февраля 2011

У меня есть UITableView со списком элементов, каждый из которых имеет свое изображение. Я думал, что пример проекта Apple LazyTableImages будет идеальным для обучения и использования для реализации такого же процесса загрузки изображений асинхронно, после получения исходных данных списка.

По большей части это работает довольно хорошо, за исключением того, что я заметил небольшую разницу в поведении, между этим примером приложения и тем, как настоящий магазин приложений загружает изображения.

Если вы запустите образец LazyTableImages, а затем выполните быструю прокрутку вниз, вы увидите, что изображения не отображаются до после прокрутки до полной остановки.

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

Я пытаюсь достичь тех же результатов, но пока я не добиваюсь прогресса. У кого-нибудь есть идеи как это сделать?

Спасибо!

Ответы [ 2 ]

10 голосов
/ 15 марта 2011

Я сбит с толку, что никто не мог ответить на это ...

Итак, в конце концов я понял, как добиться того же эффекта , точного , который используется в реальном магазине приложений, в отношении способа загрузки / отображения значков.

Возьмите пример проекта LazyTableImages и внесите несколько простых изменений.

  1. Зайдите в контроллер корневого представления и удалите все проверки, касающиеся прокрутки и / или замедления таблицы в cellForRowAtIndexPath

  2. Удалить все вызовы loadImagesForOnScreenRows и, таким образом, удалить этот метод.

  3. Зайдите в IconDownload.m и измените метод startDownload на , а не , загрузите асинхронное изображение, а вместо этого загрузите синхронизацию в фоновом потоке. Удалите весь код в 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 голосов
/ 11 февраля 2011

Извлечь UIScrollViewDelegate .Я реализовал что-то вроде этого, прослушивая scrollViewDidScroll:, вычисляя скорость прокрутки (проверяя contentOffset по последнему зарегистрированному contentOffset, разделенному на разницу во времени) и начиная загружать изображения, когда скорость падаетниже определенного порога.(Вы можете добиться чего-то похожего с помощью scrollViewDidEndDragging:willDecelerate: в UIScrollViewDelegate.)

Конечно, вам не нужно проверять скорость;вы можете просто загружать изображения в UITableViewDelegate tableView:willDisplayCell:forRowAtIndexPath: всякий раз, когда вы видите новую ячейку, но я обнаружил, что если пользователь пролистывает тонны ячеек, вам не нужно беспокоиться, пока выувидеть, что они собираются замедлить, чтобы просмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...