我在同一页面中使用UITableView进行UICollectionView。我正在SDWebImage
使用UITableView
并且工作正常。我试图将SDWebImage
与UICollectionView
一起使用,但无法实现。所以我使用了NSData,但它很冷。我怎么能解决这个问题?
更新:有没有办法将SDWebImage
与UICollectionView
一起使用?
我的代码:
- (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"]];
答案 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]
在后台以及解码也可能是耗时的