TableView性能稍差

时间:2013-01-07 16:21:20

标签: objective-c uitableview

我将尝试使用2种不同类型的单元格来实现TableView,第一种是内部带有全宽图像的高级单元格,所有其他单元格左侧都有一个小拇指图像。

我的问题是TableView的性能。如果我滚动一个可能包含20个项目的列表,它会稍微晃动一下。我的表现很红,我希望代码不是那么糟糕:

  1. “提高图像不需要缓存图像”这是对的吗?
  2. 我是否以正确的方式重复使用单元格。
  3. 这是使用2种不同细胞的常规方法吗?
  4. 以下是重要的部分:

     - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.section == 0 && indexPath.row == 0) {
            return 160;
        }
        return 60;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        NSString *cellName = [[NSString alloc] init];
    
        // [...]
    
        if(indexPath.section == 0 && indexPath.row == 0){
            cellName = @"FirstMainCell";
            CellTemplateFirstNews *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
            if(cell == nil){
                cell = [[[NSBundle mainBundle] loadNibNamed:@"CellTemplateFirstNewsView" owner:nil options:nil] objectAtIndex:0];
            }
    
            NSURL *urlRowImage = [NSURL URLWithString:[[NSString alloc]initWithFormat:@"http://webserver.de/inhalte/news/title/%@", detailDataNews.title_picture]];
            NSData *dataRowImage = [NSData dataWithContentsOfURL:urlRowImage];
            UIImageView *firstNewsImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 160)];
            firstNewsImageView.backgroundColor = [UIColor clearColor];
            firstNewsImageView.opaque = NO;
            firstNewsImageView.image = [UIImage imageWithData:dataRowImage];
            cell.backgroundView = firstNewsImageView;
    
            // [...]
    
            return cell;
        }else{
            cellName = @"MainCell";
            CellTemplateNews *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
            if(cell == nil){
                cell = [[[NSBundle mainBundle] loadNibNamed:@"CellTemplateNewsView" owner:nil options:nil] objectAtIndex:0];
            }
    
            NSURL *urlRowImage = [NSURL URLWithString:[[NSString alloc]initWithFormat:@"http://webserver.de/inhalte/news/cover/%@", detailDataNews.cover_picture]];
            NSData *dataRowImage = [NSData dataWithContentsOfURL:urlRowImage];
            UIImage *rowImage = [UIImage imageWithData:dataRowImage];
            cell.thumbImage.image = rowImage;
    
            // [...]
    
            return cell;
        }
    }r
    

3 个答案:

答案 0 :(得分:0)

不要在cellForRowAtIndexPath中分配init初始化任何对象你可能正在泄漏大量内存。请记住,每次进入视图时都会调用此方法,甚至是之前显示过的单元格。

此外,您对字符串变量的赋值是多余的。就这样做就足够了。

BOOL firstCell = (indexPath.row==0 && indexPath.section==0);
NSString *cellIdentifier = firstCell ? @"FirstMainCell" : @"MainCell"; 
UITableViewCell *genericCell = [tableView 
                         dequeueReusableCellWithIdentifier:cellIdentifier];

if (firstCell) {
   cell = (CellTemplateFirstNews*) genericCell;
   // configure...
} 

else {
   cell = (CellTemplateNews*) genericCell;
   // configure...
}

return cell;

滞后的另一个可能原因是同步调用Web服务。每次细胞变得可见时,您都会这样做。您需要懒惰地加载图像并在必要时更新UI。

答案 1 :(得分:0)

一个可能性是您忘记在Xib中输入CellIdentifier。实际上,reuseIdentifier方法需要您的单元格具有相同的标识符,但是在创建单元格时从不设置它。 Xib中的那些单元格必须输入其标识符。

答案 2 :(得分:0)

我认为主要问题是每个小区发生的同步网络请求,无论是否重复使用。罪魁祸首是dataWithContentsOfURL:

查看此apple sample code,或google短语" ios lazy table images"。 In this SO answer,我提供了一个相当简单的实现方法,负责处理图像异步,然后在完成时查找并更新正确的表视图行。