2010-11-18 4 views
2

Я использую метод, который Apple показывает при использовании подзонов в таблице (большинство из ниже приведено из их документации). Я только втягиваю через rss-канал около 12 изображений, но это приводит к медленной прокрутке - если я избавлюсь от изображений, которые он движется плавно. Изображения невелики, так что это не проблема. Прежде чем искать более привлекательные решения (обработка фона и т. Д.), Могу ли я что-нибудь сделать, чтобы сделать эту работу лучше?Прокрутка прокрутки всего несколькими изображениями

Спасибо за любую помощь, которую вы можете оказать на это.

#define MAINLABEL_TAG 1 
#define SECONDLABEL_TAG 2 
#define PHOTO_TAG  3 

-(UITableViewCell *)tableView : (UITableView *)tableView cellForRowAtIndexPath : (NSIndexPath *)indexPath { 
    UILabel * mainLabel, * secondLabel; 
    UIImageView * photo; 
    static NSString * CellIdentifier = @ "Cell"; 
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(100.0, 0.0, 210.0, 0.0)] autorelease]; 
     mainLabel.tag = MAINLABEL_TAG; 
     mainLabel.font = [UIFont systemFontOfSize:14.0]; 
     mainLabel.textAlignment = UITextAlignmentRight; 
     mainLabel.textColor = [UIColor blackColor]; 
     mainLabel.opaque = YES; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : mainLabel]; 

     secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(90.0, 30.0, 220.0, 0.0)] autorelease]; 
     secondLabel.tag = SECONDLABEL_TAG; 
     secondLabel.font = [UIFont systemFontOfSize:12.0]; 
     secondLabel.textAlignment = UITextAlignmentRight; 
     secondLabel.textColor = [UIColor darkGrayColor]; 
     secondLabel.opaque = YES; 
     secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : secondLabel]; 

     photo = [[[UIImageView alloc] initWithFrame:CGRectMake(30.0, 3.0, 50.0, 40.0)] autorelease]; 
     photo.tag = PHOTO_TAG; 
     photo.opaque = YES; 
     photo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : photo]; 
    } else { 
     mainLabel = (UILabel *)[cell.contentView viewWithTag : MAINLABEL_TAG]; 
     secondLabel = (UILabel *)[cell.contentView viewWithTag : SECONDLABEL_TAG]; 
     photo = (UIImageView *)[cell.contentView viewWithTag : PHOTO_TAG]; 
    } 
    // Configure the cell. 
    mainLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "title"]; 
    secondLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "teacher"]; 
    NSString * path = [[items objectAtIndex:indexPath.row] objectForKey:@ "audimage"]; 
    NSString * mypath = [path stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    NSURL * url = [NSURL URLWithString:mypath]; 
    NSData * data = [NSData dataWithContentsOfURL:url]; 
    UIImage * img = [[UIImage alloc] initWithData:data]; 
    photo.image = img; 
    return cell; 
    [cell release]; 
} 
+0

'[релиз клетки],' никогда не будут называться, как ничто в методе после возвращения будет достигнут – vikingosegundo

ответ

1

Похоже, каждый раз, когда вы настраиваете ячейку, вы повторно загрузить весь файл из Интернета (или чтения с жесткого диска, если это где ваши точки URL в):

NSData *data = [NSData dataWithContentsOfURL:url]; 
UIImage *img = [[UIImage alloc] initWithData:data]; 

Это действительно медленно! Способ UITableView заключается в повторном использовании ячеек - каждый раз, когда ячейка выходит за пределы экрана, она может быть возвращена методу cellForRowAtIndexPath, который будет использоваться в качестве следующей ячейки, которая станет видимой.

Это означает, что каждые время, когда новая ячейка становится видимой, вы загружаете и создаете ее изображение.

Вместо этого, у вас есть два варианта:

  1. Скачать и сохранить все изображения первого (если есть только 12, это, вероятно, не будет занимать слишком много памяти).

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

+0

Hmm..thanks..I думал that..so нет кэширования происходит с изображения, чтобы они оставались в памяти, когда изображение прокручивается из представления? – Allen

+0

@ Allen, nope - потому что в этой ячейке, которая прокручивает представление, присваивается новое изображение, поэтому он теряет свой старый. –

+0

oh ... так что теперь их путь вокруг этого, как проверка, чтобы увидеть, потеряет ли он изображение, а затем только затем зайдите и получите изображение снова .. например, если фотография, изображение равно нулю, снова получите изображение. Извините, если это не имеет смысла, просто пытайтесь найти что-то простое, если это возможно) – Allen

Смежные вопросы