Проблемы с производительностью Кэширование изображений UITableView - PullRequest
0 голосов
/ 25 декабря 2010

Я анализирую канал RSS, затем кэширую изображения из канала RSS и затем отображаю их в виде изображения ячейки. Однако метод, который я использую, замедляет время разбора RSS-канала и замедляет время прокрутки TableView. Пожалуйста, не могли бы вы сказать мне, как я мог ускорить этот процесс. Одна из ссылок на изображения: http://a1.phobos.apple.com/us/r1000/009/Video/95/5d/25/mzl.gnygbsji.71x53-75.jpg,, и один из RSS-каналов, которые я пытаюсь проанализировать: http://itunes.apple.com/au/rss/topmovies/limit=50/xml. Вот код, который я использую для кэширования изображений:

- (UIImage <em>)getCachedImage: (NSString</em>)url {</p> <pre><code>UIImage* theImage = [imageCache objectForKey:url]; if ((nil != theImage) && [theImage isKindOfClass:[UIImage class]]) { return theImage; } else { theImage = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString: url]]]; [imageCache setObject:theImage forKey:url]; return theImage; } }

И код, который я использую для получения изображений: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {</p> <pre><code>static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; } // Configure the cell... int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1]; int wierd = storyIndex *6; cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"songtitle"]; cell.detailTextLabel.text = [[stories objectAtIndex:storyIndex] objectForKey:@"artist"]; if ([imageLinks count] != 0) { cell.imageView.image = [self getCachedImage:[imageLinks objectAtIndex:wierd]]; } return cell; }

Как вы, наверное, видите, я использую NSMutableArray с именем imageLinks, для хранения imageLinks. Однако я получаю три ссылки на изображения из ленты rss, что означает, что если я пытаюсь получить кэшированное изображение: [imageLink objectAtIndex: storyIndex], изображения находятся в неправильных местах, но если я получаю кэшированное изображение: [imageLink objectAtIndex: странно], похоже, работает отлично. Так что, если вы увидите исправление, это было бы здорово.

Спасибо заранее.

1 Ответ

2 голосов
/ 25 декабря 2010

Ваша проблема в том, что вы используете dataWithContentsOfURL, который является API блокировки. Это означает, что он выполняется в основном потоке вместе с вашим пользовательским интерфейсом и будет блокировать ваш пользовательский интерфейс до его завершения. Это плохо.

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

...