我使用UICollectionView并希望显示从其服务器中获取的图像。要做到这一点,我使用UIImageView+AFNetworking
。在我的cellForItemAtIndexPath
方法中,我有以下代码:
__weak CustomCollectionViewCell *weakCell = cell;
[cell.cellImageView setImageWithURLRequest:request
placeholderImage:placeholderImage
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
weakCell.cellImageView.image = image;
[weakCell setNeedsLayout];
} failure:nil];
占位符始终显示,但有时下载的图像无法显示。关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
我怀疑问题是当你尝试设置图像时你是在后台线程上,而你应该总是在主线程上执行UI操作。
尝试使用类似
的设置在主线程中设置图像__weak CustomCollectionViewCell *weakCell = cell;
[cell.cellImageView setImageWithURLRequest:request
placeholderImage:placeholderImage
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
dispatch_async(dispatch_get_main_queue(), ^{
weakCell.cellImageView.image = image;
});
} failure:nil];
答案 1 :(得分:1)
我非常确定AFNetworking会在主线程上移动所有块执行,我只是想知道您是否确定这些图像是否已正确下载。
尝试记录重新调整后的图像的图像大小,如果存在则始终使用故障块,可能只是打印错误。
这样的事情:
typeof(self) __weak weakCell = cell; //but you don't need in that scenario
[cell.cellImageView setImageWithURLRequest:request
placeholderImage:placeholderImage
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
NSLog(@"Image %@ scale %f", NSStringFromCGSize(image.size), image.scale);
weakCell.cellImageView.image = image;
[weakCell setNeedsLayout];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Error %@",error.localizedDescription);
}];
答案 2 :(得分:0)
为您解决问题
您只需要#import <SDWebImage/UIImageView+WebCache.h>
到项目中,并且只需使用以下代码即可在下载图像时定义占位符:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell"
forIndexPath:indexPath];
DLog(@"url at index %d : %@", indexPath.row, ((MyObject *)[self.list.array objectAtIndex:indexPath.row]).imageUrl);
MyObject *object = (MyObject *)[self.list.array objectAtIndex:indexPath.row];
[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
return cell;
}
它还可以缓存下载的图像并为您提供出色的性能。
希望它会对你有所帮助!
答案 3 :(得分:0)
下载图像后,我更换了
[self.myCollectionView reloadData]
带
[self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
然后刷新并且效果很好,你可以尝试一下。