UICollectionView滞后

时间:2015-07-09 06:12:27

标签: ios uicollectionview lag collectionview

我有一个可以滚动图像的分页UICollectionView。每个图像都填满了屏幕。对于常规照片,我的collectionView流畅地滚动但是全景拍摄,当我滚动图像时它开始滞后。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{
    imageCell *cell = (imageCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    cell.tag = indexPath.row;

    PFObject *temp = [_dataArray objectAtIndex:indexPath.row];
    PFUser *user = [temp objectForKey:@"user"];
    PFFile *file = [temp objectForKey:@"image"];

    [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error){
        if (!error) {
            cell.selectedImageView.image = [UIImage imageWithData:data];
            self.navigationItem.title = [user objectForKey:@"Name"];
        }
    }];

    return cell;
}

如您所见,我在后台加载图像。

我是否有可能需要在willDisplayCell中做点什么?感谢

2 个答案:

答案 0 :(得分:0)

您每次都在加载数据。尝试防止这种情况。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{
    imageCell *cell = (imageCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    ...

    if (cell.selectedImageView.image == nil)
    {
        [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error){
            if (!error) {
                cell.selectedImageView.image = [UIImage imageWithData:data];
                self.navigationItem.title = [user objectForKey:@"Name"];
            }
        }];
    }

    return cell;
}

此外,有时它只是在模拟器中。 尝试重置模拟器或Xcode然后再次运行。

我有经验,有时候,我甚至检查可能的内存处理错误,但重启模拟器完成了工作。

答案 1 :(得分:0)

我之前从未真正使用过Parse对象,但似乎是因为一个单元格试图同时加载多个图像。我认为你应该移动将图像加载到单元格的逻辑,并在prepareForReuse中重用它时取消图像加载。在单元格中加载图像时,通常会使用此提示。 我会给你一个快速的例子,希望它能给你一个想法。

in imageCell,

var file: PFFile? {
    didSet {
        if let f = file {
             [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error){
                if (!error) {
                     selectedImageView.image = [UIImage imageWithData:data];
                }
            }];
        }
    }
}

........

override func prepareForReuse() {
    super.prepareForReuse()
    if let f = file {
       f.cancel()
    }
}
in collectionView:cellForItemAtIndexPath:

.....
cell.file = file
.....