3

我有一个iOS从数据源方法中提取图像的项目。我希望能够从中提取图像assets library(下面的代码块就可以了)。

但是,我需要此dataSource方法返回 a UIImage,但是当我使用资产库方法获取图像时,图像会在结果块中返回。简单地放入return image结果块显然是行不通的。

有谁知道如何让该方法UIImage从结果块内部返回 a ?我已经看到了其他几个关于在块内返回图像的 SO 问题,但据说它们调用了另一种方法。我 - 不幸的是 - 不能这样做,因为这个方法是一个nimbus数据源方法,它必须返回一个 UIImage。

任何帮助或建议将不胜感激!下面的代码:

- (UIImage *)photoAlbumScrollView: (NIPhotoAlbumScrollView *)photoAlbumScrollView
                     photoAtIndex: (NSInteger)photoIndex
                        photoSize: (NIPhotoScrollViewPhotoSize *)photoSize
                        isLoading: (BOOL *)isLoading
          originalPhotoDimensions: (CGSize *)originalPhotoDimensions {

    __block UIImage *image = nil;
    ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
    [assetslibrary assetForURL:[_photos objectAtIndex:photoIndex]
                   resultBlock:^(ALAsset *asset){
                       ALAssetRepresentation *rep = [asset defaultRepresentation];
                       CGImageRef imageRef = [rep fullScreenImage];
                       if (imageRef) {
                           image = [UIImage imageWithCGImage:imageRef];

                       }

                   }
                  failureBlock:^(NSError *error) {
                      //return nil;
                  }];

    return image;
}
4

2 回答 2

2

您应该为每个图像创建一个数组。首次调用此数据源方法时,数组中将没有该索引的图像。启动资产调用,然后返回占位符图像。当块返回时,将占位符图像替换为块中返回的资产图像。您可能需要使用 GCD 在主队列上执行此操作。

于 2012-09-27T23:41:43.033 回答
0

所以我想我有办法解决你的问题。这个想法是利用 dispatch_group,因为你可以在一个调度组上等待——它为你提供了一种阻塞线程直到发生某些事情的方法。它可能要求您的数据源操作不使用主线程,但您将不得不使用它。让我们假设实现 photoAlbumScrollView 的对象称为“obj”。

  • obj 创建一个串行调度队列(称为队列)
  • 数据源发送 [obj photoAlbumScrollView] 消息
  • photoAlbumScrollView 做了它现在所做的,但在返回之前等待队列
  • 最后一个块解除阻塞队列,让组完成

编码:

__block UIImage *image = nil;
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];

dispatch_queue_t queue = dispatch_queue_create("com.myApp.assetFetch", DISPATCH_QUEUE_SERIAL);

[assetslibrary assetForURL:[_photos objectAtIndex:photoIndex]
               resultBlock:^(ALAsset *asset){
                   ALAssetRepresentation *rep = [asset defaultRepresentation];
                   CGImageRef imageRef = [rep fullScreenImage];
                   if (imageRef) {
                       image = [UIImage imageWithCGImage:imageRef];
                   }
                   dispatch_resume(queue);
               }
              failureBlock:^(NSError *error) {
                   dispatch_resume(queue);
              }];
dispatch_suspend(queue);
dispatch_sync(queue, ^{ NSLog(@"UNSUSPEND!"); }); // ultimately a block with just a ';' in it
dispatch_release(queue);

return image;

我显然没有对此进行测试,但是它或接近它的东西应该可以工作,再次假设您可以在线程上而不是在 mainThread 上进行此操作。

于 2012-09-27T21:22:22.263 回答