使用NSData进行UICollectionView Scroll Freeze(imageView)

时间:2015-02-13 13:55:07

标签: ios uicollectionview nsdata uicollectionviewcell sdwebimage

我在同一页面中使用UITableView进行UICollectionView。我正在SDWebImage使用UITableView并且工作正常。我试图将SDWebImageUICollectionView一起使用,但无法实现。所以我使用了NSData,但它很冷。我怎么能解决这个问题?

更新:有没有办法将SDWebImageUICollectionView一起使用?

我的代码:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

static NSString *simpleTableIdentifier = @"cell";

ProductsCollectionViewCell *pCell = [_collection dequeueReusableCellWithReuseIdentifier:simpleTableIdentifier forIndexPath:indexPath];

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[_arrayImage objectAtIndex:indexPath.row]]];

_imgCollection = (UIImageView *)[pCell viewWithTag:100];
_imgCollection.image = [UIImage imageWithData:imageData];

pCell.layer.shouldRasterize = YES;
pCell.layer.rasterizationScale = [UIScreen mainScreen].scale;

}

我的表格视图代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"productCell";

ProductsTableViewCell *pCell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

[pCell.imgProduct sd_setImageWithURL:[NSURL URLWithString:[_arrayImage objectAtIndex:indexPath.row]]
                    placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

3 个答案:

答案 0 :(得分:0)

可能是你缺少contentView

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

static NSString *simpleTableIdentifier = @"cell";

ProductsCollectionViewCell *pCell = [_collection dequeueReusableCellWithReuseIdentifier:simpleTableIdentifier forIndexPath:indexPath];

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[_arrayImage objectAtIndex:indexPath.row]]];

_imgCollection = (UIImageView *)[pCell.contentView viewWithTag:100];
_imgCollection.image = [UIImage imageWithData:imageData];
}

答案 1 :(得分:0)

您正在使用的方法

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[_arrayImage objectAtIndex:indexPath.row]]];

是同步的,这意味着它将阻塞线程直到完成。 (这就是冻结的原因)

我建议您找出一种方法,将SDWebImage用于您的代码,如果您告诉我们为什么不起作用,我们可以帮您解决这个问题。

编辑:

查看SDWebImage的{​​{3}}中的第一个示例,特别是在此行:

[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

现在使用它而不是代码的这一行:

_imgCollection.image = [UIImage imageWithData:imageData];

另外,摆脱下载图像的行。

答案 2 :(得分:0)

可能是

的事实
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL ...

是在主线程上执行耗时的操作吗?

为什么不尝试将fetch放在后台呢?

dispatch_async(
         dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSURL* url = [NSURL URLWithString:[_arrayImage objectAtIndex:indexPath.row]]
    NSData *imageData = [NSData dataWithContentsOfURL:url];
    dispatch_async(dispatch_get_main_queue(), ^{
          UICollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath];
          if(cell) { // cell is visible
             cell.imageView.image = [UIImage imageWithData:imageData];
          }

    });
});

最后,请确保

[_arrayImage objectAtIndex:indexPath.row] 

确实是一个字符串,_arrayImage是一个字符串数组

最后我会考虑把

[UIImage imageWithData:imageData]

在后台以及解码也可能是耗时的