AFNetworking 2.0和下载多个图像

时间:2014-02-20 07:25:33

标签: ios objective-c uicollectionviewcell afnetworking-2

我认为我遇到的问题是我的代码或逻辑。

我想做什么

UICollectionView中有一个view Controller 在集合视图中,我有一个自定义UICollectionViewCell - 其自定义的原因是需要下载并为每个单元格设置不同的图像。这些图像中的每一个都是具有其他属性的项目,例如日期/标题等。

这就是我尝试过的

创建了一个自定义UITableViewCell,在该类中我有以下代码:

 -(void) setDetailsWithTitle: (NSString *) title Image:(UIImage *) image Items: (NSArray *)items
    {
        int i = 0;

        for (BBItem *item in items){

            BBThumbnailView *thumbNailView = [[BBThumbnailView alloc]initWithFrame:CGRectMake(5 + (60 * 1), 5, 60, 60)];
            [self.contentView addSubview:thumbNailView];
            thumbNailView.item = item;
            thumbNailView.clipsToBounds = YES;

            i++;
        }
    }

这里我给单元格一个包含所有项目的数组。这些项目是对象。我下载了它们并用XML解析器解析它们。这非常有效并且在检查每个对象时 - 它们都具有我需要的正确属性。

我在这个方法中还没有使用UIImage参数。 for循环遍历数组中的每个项目并设置图像,thumbNailView.item是我设置的对象。

然后在BBThumbnailView我做了这个:

设置每个项目并获取其网址

 (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {


        self.shouldShowPlaceHolder = NO;
        self.backgroundColor = [UIColor clearColor];

        UIImageView *backGroundImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Thumbnail_Background_Big.png"]];


        [self addSubview:backGroundImageView];

        self.layer.masksToBounds = NO;

        self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(4, 2, 60, 60)];

            //  self.imageView.backgroundColor = [UIColor whiteColor];

        [self addSubview:self.imageView];
    }
    return self;
}

self.imageView is the imageView I am setting for the cells. The other imageViews are placeholder images. 

-(void)setItem:(BBItem *)aItem
{

    _item = aItem;
    if (self.item){

        if (self.item.thumbnailUrl && [self.item.thumbnailUrl length] > 0){

            [self loadUrl: [NSURL URLWithString:self.item.thumbnailUrl]];
        }
    }

}

这是我重写属性BBItem的setter。每个项目仅开始下载URL。

loadUrl方法中:

-(void)loadUrl:(NSURL *)url
{
    NSURLRequest *urlRequest = [[NSURLRequest alloc]initWithURL:url]; 
    AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest];
    requestOperation.responseSerializer = [AFImageResponseSerializer serializer];
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            //NSLog(@"Response: %@", responseObject);
            //self.imageView.image = responseObject;
        UIImage *image = [[UIImage alloc] init];
        image = responseObject; 
        [self.imageView setImage:image];



    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Image error: %@", error);
    }];
    [requestOperation start];

}

现在我已经在lodUrl方法上设置了一个断点并且它被执行了很多次(尽可能多的BBItem),每个项目都有不同的URL。

问题

每个BBCollectionViewCell的图像都设置为相同的图像。当我重新加载视图或关闭应用程序并再次打开它时,这将始终是一个不同的图像,它将是一个不同的图像。我认为它是下载和设置的最后一个图像。

为什么我认为这种情况正在发生

我认为原因是由于每个新请求我取消之前的请求?任何人都可以对这个问题有所了解吗?

2 个答案:

答案 0 :(得分:2)

如果要创建AFHTTPRequestOperation的队列,可以使用:NSOperationQueue *queue。但我不认为这是问题.. 我认为你应该这样做(我改变了功能):

-(void) setDetailsWithTitle: (NSString *) title Image:(UIImage *) image Item: (BBItem *)item
{
    BBThumbnailView *thumbNailView = [[BBThumbnailView alloc]initWithFrame:CGRectMake(5 + (60 * 1), 5, 60, 60)];
    [self.contentView addSubview:thumbNailView];
    thumbNailView.item = item;
    thumbNailView.clipsToBounds = YES;
}

你应该为每个cell

打电话

希望这会有所帮助。

答案 1 :(得分:0)

我想说你没有把Operations放在一个操作队列中。因此,当您在操作上调用start时,它会立即在后台线程上执行,后台线程可能只允许一次执行一次操作。

2个问题。为什么不使用UIImageView + AFNetworking?

为什么不批量提交图片请求?或者至少在NSOperationQueue上运行它们