滚动表格时应用程序缓慢

Posted

技术标签:

【中文标题】滚动表格时应用程序缓慢【英文标题】:Slow application while scrolling through the table 【发布时间】:2015-07-17 14:49:21 【问题描述】:

我是移动开发的新手。在我的应用程序中,我有一个表格,其中显示了用户创建的食谱。一个单元格被设计为一个带有图像(异步加载)和 2 个标签的 nib 文件。在模拟器上一切似乎都很好。但是,即使在实现了图像的异步加载之后,在真实设备上滚动表格看起来也很糟糕。 在使用时间分析器时,大部分时间都被主要功能占用。所以我在想这是否可能是由使用核心数据引起的。我不确定。 如果有人能帮助我解决这个问题,我将不胜感激。

这实际上是我用数据填充单元格的方式:

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    static NSString *identifier = @"TableCell";
    SimpleTableViewCell *cell = (SimpleTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    

    Receipe *cellRecipe = [self.fetchedResultsController objectAtIndexPath:indexPath];

    cell.recipeName.text = cellRecipe.name;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:cellRecipe.image];

    dispatch_async(dispatch_get_global_queue(0, 0), ^
        UIImage *image = [UIImage imageWithContentsOfFile:path];
        dispatch_async(dispatch_get_main_queue(), ^
            [cell.recipeImage setImage:image];
        );
    );

    cell.recipeDetails.text = cellRecipe.ingredients;

    UIImage *favourite;
    if ([cellRecipe.isFavourite boolValue] == YES) 
        favourite = [UIImage imageNamed:@"liked.png"];
    

    [cell.recipeIsFavouriteButton setImage:favourite forState:UIControlStateNormal];
    favourite = nil;

    return cell;

【问题讨论】:

请在您的问题中添加您的 tableview 数据源方法和发出图像请求的代码。 不再需要这个笨重的 nib 文件加载代码。你应该在表格视图中注册一个笔尖并使用dequeueReusableCellWithIdentifier:forIndexPath: 仪器中的时间分析器告诉您什么?哪些代码行占用的时间最多?从那里开始。如果您愿意,可以分享个人资料,但这是第一步。否则人们只是在猜测(很糟糕)。 这是分析器显示给我的postimg.org/image/mtycxcscj 【参考方案1】:

使用

[tableView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

而不是

[tableView dequeueReusableCellWithIdentifier:identifier];

我认为不需要异步加载,使用正常加载。

【讨论】:

我这样做了,但这并没有使应用程序免于缓慢的表格滚动( 您是否尝试过正常加载而不是异步加载? 还在代码中添加 [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 以从超级视图中删除子视图 是的,我从它开始。现在,在你写完这篇文章之后,我决定回到简单的加载,毕竟看起来更好。但问题并没有消失。我现在会尝试删除子视图

以上是关于滚动表格时应用程序缓慢的主要内容,如果未能解决你的问题,请参考以下文章

如何修复滚动缓慢的表格视图

UITableView 图像上的缓慢滚动

iphone中Json数据加载缓慢

当许多单元格同时可见时,QTableView 滚动缓慢

JS控制滚动条缓慢移动到底部 有问题

iphone索引表视图问题