Search code examples
iosuicollectionviewnsdatauicollectionviewcellsdwebimage

UICollectionView Scroll Freeze with NSData (imageView)


I've UICollectionView with UITableView in the same page. I'm using SDWebImage with UITableView and it is working fine. I'm trying to use SDWebImage with UICollectionView but couldn't make it. So I have used NSData but it is freezing with it. How I can solve this issue?

UPDATE: Is there a way to use SDWebImage with UICollectionView?

My code:

- (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;

}

My code for table view

- (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"]];

Solution

  • The method you are using

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

    is synchronous, which means it will block the thread until it's done. (That's why it's freezing)

    I recommend you figure out a way to use SDWebImage with your code, if you tell us why that didn't work, we can probably help you with that.

    EDIT:

    Look at the first example from SDWebImage's documentation, specifically at this line:

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

    Now use it instead of this line of your code:

    _imgCollection.image = [UIImage imageWithData:imageData];
    

    And also, get rid of the line where you are downloading the image.