我认为我遇到的问题是我的代码或逻辑。
我想做什么
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
的图像都设置为相同的图像。当我重新加载视图或关闭应用程序并再次打开它时,这将始终是一个不同的图像,它将是一个不同的图像。我认为它是下载和设置的最后一个图像。
为什么我认为这种情况正在发生
我认为原因是由于每个新请求我取消之前的请求?任何人都可以对这个问题有所了解吗?
答案 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上运行它们