【问题标题】:UIImageView+AFNetworking - need to scroll UICollectionView to set imageUIImageView+AFNetworking - 需要滚动 UICollectionView 来设置图像
【发布时间】:2014-06-23 07:29:33
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我怀疑问题是您在尝试设置图像时处于后台线程,而您应该始终在主线程上执行 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];
    

    【讨论】:

    • 谢谢,但似乎没有帮助。
    • 如何获得对单元格的强引用?单元格没有保留块,因此不会导致强引用循环
    【解决方案2】:

    我很确定 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);
                                               }];
    

    【讨论】:

      【解决方案3】:

      为您解答问题

      您只需要#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;
      }
      

      它还缓存下载的图像并为您提供出色的性能。

      希望对你有帮助!

      【讨论】:

        【解决方案4】:

        下载图片后,我替换了

        [self.myCollectionView reloadData]

        [self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];

        然后刷新就好了,你可以试试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多