滚动表格时应用程序缓慢
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)];
以从超级视图中删除子视图
是的,我从它开始。现在,在你写完这篇文章之后,我决定回到简单的加载,毕竟看起来更好。但问题并没有消失。我现在会尝试删除子视图以上是关于滚动表格时应用程序缓慢的主要内容,如果未能解决你的问题,请参考以下文章