Производительность дрожания в UITableView после обновления iOS 4 - PullRequest
2 голосов
/ 27 июня 2010

У меня есть несколько больших изображений в сгруппированном UITableView.В каждом разделе есть 1 строка, которая содержит изображение, и для каждого раздела об изображении есть связанный текст заголовка и нижнего колонтитула.Я упорно трудился, чтобы получить его для прокрутки гладко является iPhone OS 3.x и, наконец, удалось.Но ... когда я обновился до iOS 4, все изменилось.Теперь при загрузке новой ячейки производительность становится очень резкой.Вот мой код cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CellIdentifier";

    UIImageView *photo;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    ApplicationDelegate *appDelegate = (ApplicationDelegate *)[[UIApplication sharedApplication] delegate];

    NSString *fileName = [NSString stringWithFormat:@"%@",[[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainTrackImage"]];
    UIImage *theImage = [UIImage imageNamed:[[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainTrackImage"]];

    imageHeight = CGImageGetHeight(theImage.CGImage);
    imageWidth = CGImageGetWidth(theImage.CGImage);

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        photo = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, (imageHeight*320)/imageWidth)] autorelease];
        photo.tag = PHOTO_TAG;
        [cell addSubview:photo];
    } else {
        photo = (UIImageView *) [cell viewWithTag:PHOTO_TAG];
        [photo setFrame:CGRectMake(0, 0, 320, (imageHeight*320)/imageWidth)];
    }

    photo.image = theImage;
    return cell;
}

Примечание. Я попытался использовать следующий метод вместо метода imageNamed безуспешно:

UIImage *theImage = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", bundlePath,fileName]];

Я дажепробовал предварительно кэшировать изображения, но безуспешно.Любая помощь будет принята с благодарностью.

ОБНОВЛЕНИЕ: я попытался поэкспериментировать с использованием Grand Central Dispatch для загрузки изображений, создав очередь изображений и загрузив их асинхронно:

dispatch_async(_image_queue, ^{
photoImageView.image = [imageCacheNS objectForKey:imageString];});

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

ОБНОВЛЕНИЕ 2: Я все еще не смогчтобы сделать эту работу.Сейчас я изучаю использование метода drawRect для рисования ячейки.Я надеюсь, что это улучшит производительность прокрутки.Пример кода # 5 AppleView tableViewSuite показывает, как это сделать, но у меня возникают проблемы с поиском того, как заставить это работать для моего проекта.У кого-нибудь есть опыт использования drawRect: для загрузки изображений в таблицу?

Спасибо!

Ответы [ 4 ]

1 голос
/ 27 июня 2010

Пример кода LazyTableImages от Apple может помочь. http://developer.apple.com/iphone/library/samplecode/LazyTableImages/Introduction/Intro.html

Показывает, как загружать изображения без блокировки интерфейса.

1 голос
/ 29 июня 2010

re your: «Проблема, которую я получаю, состоит в том, что изображения загружаются очень медленно, и когда я прокручиваю таблицу, ранее просмотренные изображения показываются в течение нескольких секунд, пока не загрузится новое изображение». Держу пари, что это потому, что ячейка изображения используется повторно, но в случае, если это не ноль, вы не устанавливаете свойство изображения в ноль, чтобы очистить старую. Просто предположение, поскольку ваш код теперь явно отличается от того, что опубликовано выше.

Кстати - я еще не использовал блоки частично, потому что они требуют iOS 4 (если вы не используете компиляторы не Apple, т.е. PLBlocks), и я писал приложения для поддержки 3.x. На тот случай, если вы сейчас работали только с 4.x и могли не осознавать, что код, который вы пишете, будет недоступен для iOS 3.x (например, iPad на данный момент). Очевидно, что вы можете делать условный код в зависимости от версии ОС во время выполнения и т. Д.

1 голос
/ 27 июня 2010

Попробуйте загрузить изображение в другой теме.Это поможет улучшить отзывчивость вашего табличного представления (и других элементов пользовательского интерфейса).Это место, где блоки и libdispatch будут отличным дополнением к вашему коду.

0 голосов
/ 25 октября 2010

После огромного объема работы и нескольких связей с поддержкой Apple dev, я наконец-то заработал. Сейчас я загружаю очень большие изображения в виде таблицы в фоновом режиме и очень быстро выполняю прокрутку.

В основном я следовал частям кода из образца кода WWDC 2010 "CoreAnimationImageBrowser". Он разработан для iPad и основан на пользовательском scrollView вместо tableView, но для загрузки изображений используется класс ImageScrollView.

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

Вроде странный взлом, но Apple Tech, похоже, думала, что все в порядке.

Удачи всем, кто пытается это сделать. Мне потребовалось немало времени, чтобы понять это.

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