UIImageView + AFNetworking - 需要滚动UICollectionView来设置图像

时间:2014-05-06 15:27:45

标签: ios objective-c cocoa-touch uiimageview afnetworking

我使用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];

占位符始终显示,但有时下载的图像无法显示。关于如何解决这个问题的任何想法?

4 个答案:

答案 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]];

然后刷新并且效果很好,你可以尝试一下。