我的项目中有一个集合视图,其中包含大量来自Web服务的数据。当我垂直滚动集合视图时,它不会平滑滚动。
我使用SDWebImage
异步加载图片。
以下是cellForItemAtIndexPath
的代码:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
CategoryListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CategoryListCell" forIndexPath:indexPath];
cell.movName.text = [nameArray objectAtIndex:indexPath.item];
num = [[numArray objectAtIndex:indexPath.item]integerValue];
cell.itemNo.text = [NSString stringWithFormat:@"%ld", (long)num];
[cell.movImage sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[imageArray objectAtIndex:indexPath.item]]] placeholderImage:[UIImage imageNamed:@"Main_Logo.png"]];
[cell.movImage setShowActivityIndicatorView:YES];
[cell.movImage setIndicatorStyle:UIActivityIndicatorViewStyleWhite];
return cell;
}
当我在Simulator上运行项目时,它可以顺利滚动,但在物理设备上运行它时,它不能平滑滚动。我怎么解决这个问题?
答案 0 :(得分:2)
for loop
看起来像罪魁祸首,基于它有多大。 SDWebImage
负责在后台线程上进行操作,所以应该没问题。
但是,对方法collectionView:cellForRowAtIndexPath:
进行概要分析并计算渲染每个单元格所需的时间。如果超过0.016秒 - 这是导致性能延迟的原因。下面是您可以快速用于衡量单元格渲染性能的代码。
NSDate *methodStart = [NSDate date];
CategoryListCell *cell = [[CategoryListCell alloc]init];
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CategoryListCell" forIndexPath:indexPath];
cell.movName.text = [nameArray objectAtIndex:indexPath.item];
for (int i=0; i<=numArray.count; i++)
{
num = [[numArray objectAtIndex:indexPath.item]integerValue];
cell.itemNo.text = [NSString stringWithFormat:@"%ld", (long)num];
}
[cell.movImage sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[imageArray objectAtIndex:indexPath.item]]] placeholderImage:[UIImage imageNamed:@"Main_Logo.png"]];
[cell.movImage setShowActivityIndicatorView:YES];
[cell.movImage setIndicatorStyle:UIActivityIndicatorViewStyleWhite];
NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"executionTime = %f", executionTime);
有关快速分析此方法的详细信息,请查看:How to log a method's execution time exactly in milliseconds?
答案 1 :(得分:0)
我认为,你错了行代码。因此,它不会在collectionView中平滑。您可以在背景下设置它,也可以在函数cellForItemAtIndexPath之外计算它。
答案 2 :(得分:0)
我真的没有看到很多问题。我想指出几件事。
您不必要地在cellForItemAtIndexPath中启动集合视图单元格。 dequeueReusableCellWithReuseIdentifier:forIndexPath:将始终返回一个单元格。
你的for循环在cellForItemAtIndexPath中有什么作用?它设置了itemNo文本numArray计数次数。我误读了吗?
你在movImage有圆角吗?然后尝试没有圆角,看看你是否能看到差异。渲染圆角很重。