dispatch_async(dispatch_get_main_queue()不能在iPad上运行,但可以在iPhone上运行

时间:2016-08-26 12:28:40

标签: ios objective-c iphone ipad sdwebimage

我正在使用SDWebImage库并在iPhone上工作。但我不知道为什么不在iPad上调用它。我试图提出突破点,但它也没有达到突破点。我将此方法放在cellForItemAtIndexPath中。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString* cellIdentifier = @"CustomCollectionViewCell";
     CustomCollectionViewCell* cell = (CustomCollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
     [cell.downloadButton setTag:indexPath.row];
     [cell.downloadButton addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
     catalogModel = [catalogArray objectAtIndex:indexPath.item];
     cell.cellDescription.text = catalogModel.catalogName;
     SDWebImageManager *manager = [SDWebImageManager sharedManager];
     NSString *urlStr = catalogModel.imageNameThumbnail;
     NSURL *url = [NSURL URLWithString:urlStr];
     dispatch_async(dispatch_get_main_queue(), ^{
             if ([self.catalogCollectionView.indexPathsForVisibleItems containsObject:indexPath])
             {
                  catalogModel = [catalogArray objectAtIndex:indexPath.item];
                  [manager downloadImageWithURL:[NSURL URLWithString:catalogModel.imageNameThumbnail] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {}completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL)
                  {
                       cell.cellImageView.image = image;
                       NSLog(@"%@",catalogModel.catalogName);
                  }];
             };

        });
     return cell;
}

1 个答案:

答案 0 :(得分:2)

并发图像加载实现存在问题。当-collectionView: cellForItemAtIndexPath:正在调用时,设备会在主队列上执行代码。假设-downloadImageWithURL:options:progress:completed:方法在后台线程上执行图像加载并立即返回,我们可以在没有dispatch_async(dispatch_get_main_queue()...包装的情况下调用它。否则,我们无法保证在主线程上执行完成处理程序,因此代码应如下所示

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString* cellIdentifier = @"CustomCollectionViewCell";

     CustomCollectionViewCell* cell = (CustomCollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

     ...

     SDWebImageManager *manager = [SDWebImageManager sharedManager];

     // methods with completion block usually return instantly
     [manager downloadImageWithURL:aURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize){} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
         // ensure ui is updating on main thread and for visible cell
         dispatch_async(dispatch_get_main_queue(), ^{
             if ([collectionView.indexPathsForVisibleItems containsObject:indexPath]) {
                 cell.cellImageView.image = image;
             }
         });
     }];

     return cell;
}

iPhone和iPad上的不同结果可以通过测试设备技术规范的架构差异来解释。