iOS - 异步下载图像并将其与Core Data一起使用

时间:2014-04-07 15:42:23

标签: ios objective-c asynchronous

在我的核心数据模型中,我有一个保留图像URL的实体。我想下载这些图像,以便我可以在我的UICollectionView模型中使用它们,这是我的核心数据实体的数组。我希望始终能够同步访问这些图像(假设它们已经被异步下载),因此它们在各自的单元格中加载之间没有延迟。

目前,我在cellForIndexPath:的{​​{1}}数据源委托方法中使用异步方法,但是当重新加载集合视图时,如果仍有图像被下载,则会将它们分配给在此期间插入了细胞错误的细胞。

这个问题似乎应该非常明显地解决,但我无法解决。

非常感谢任何想法。

感谢。

2 个答案:

答案 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)

你可以做几件事:

  1. 在单元格的prepareForReuse中,您可以取消任何(仍然)待处理的图像请求。
  2. 在图像请求的完成过程中,您可以在设置图像之前验证图像网址是否仍然符合预期。
  3. 类似的东西:

    -(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;
                }
            }];
        }
    }