在我的核心数据模型中,我有一个保留图像URL的实体。我想下载这些图像,以便我可以在我的UICollectionView
模型中使用它们,这是我的核心数据实体的数组。我希望始终能够同步访问这些图像(假设它们已经被异步下载),因此它们在各自的单元格中加载之间没有延迟。
目前,我在cellForIndexPath:
的{{1}}数据源委托方法中使用异步方法,但是当重新加载集合视图时,如果仍有图像被下载,则会将它们分配给在此期间插入了细胞错误的细胞。
这个问题似乎应该非常明显地解决,但我无法解决。
非常感谢任何想法。
感谢。
答案 0 :(得分:1)
您可以在viewDidLoad
中异步下载图像,并将它们添加到NSMUtableArray中,如下所示
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < carPhotos.count; i++) {
NSURL *photoURL = [NSURL URLWithString:carPhotos[i]];
NSData *photoData = [NSData dataWithContentsOfURL:photoURL];
UIImage *image = [UIImage imageWithData:photoData];
[carImages addObject:image];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
});
然后检查cellForRowAtIndexpath
以确保indexPath与arrayIndex匹配,如果要为未加载的图像加载虚拟图像,如下所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ static NSString * CellIdentifier = @“Cell”; CarsAppCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; cell.carMakeLabel.text = carMakes [indexPath.row]; cell.carModelLabel.text = carModels [indexPath.row];
if (carImages.count > indexPath.row) {
cell.carImage.image = carImages[indexPath.row];
} else {
cell.carImage.image = [UIImage imageNamed:@"dummy.png"];
}
return cell;
}
我希望它有所帮助....
答案 1 :(得分:0)
你可以做几件事:
类似的东西:
-(void)prepareForReuse
{
[super prepareForReuse];
_imageUrl = nil;
}
-(void)useImageUrl:(NSString*)imageUrl
{
_imageUrl = imageUrl;
if(_imageUrl)
{
__weak typeof(self) weak = self;
[UIImage fetchRemoteImage:imageUrl completion:^(UIImage* image){
if(weak.imageUrl && [weak.imageUrl isEqualToString:imageUrl] && image) {
weak.imageView.image = image;
}
}];
}
}