iPhone: проблема производительности UITableView с imageWithContentsOfFile - PullRequest
1 голос
/ 07 декабря 2011

У меня проблема с производительностью при прокрутке UITableView, когда я использую imageWithContentsOfFile вместо imageNamed. Вот мой код:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UniversalAppAppDelegate *delegate = (UniversalAppAppDelegate *) [[UIApplication sharedApplication] delegate];
NSDictionary *res = [[delegate comments] objectAtIndex:indexPath.section];

if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

 ......

// This line has a problem...when I use imageNamed here instead of imageWithContentsOfFile, it works absolutely fine
imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:imagepath]];
[imageView setFrame: CGRectMake(30, 10, 55, 55)];
[sectionHeaderView addSubview:imageView];

......

cell.backgroundView = sectionHeaderView;
return cell;

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

Код кэширования:

NSMutableDictionary *thumbnailCache = [[NSMutableDictionary alloc] init];

- (UIImage*)thumbnailImage:(NSString*)fileName
{
UIImage *thumbnail = [thumbnailCache objectForKey:fileName];

if (nil == thumbnail)
{
    NSString *thumbnailFile = [self filePath:fileName];
    thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];
    [thumbnailCache setObject:thumbnail forKey:fileName];
}
return thumbnail;
}

Использование:

imageView = [[UIImageView alloc] initWithImage:[delegate thumbnailImage:[res objectForKey:@"ImageName"]]];

1 Ответ

2 голосов
/ 07 декабря 2011

Вы можете попробовать создать массив UIImages в методе viewDidLoad контроллера и использовать изображения в этом массиве в вашем cellForRowAtIndexPath.

Это избавит от необходимости вызывать imageWithContentsOfFile для каждого изображения при рисовании табличного представления.

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

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