3

iOSデータソース メソッドから画像を取得するプロジェクトがあります。から画像を取得できるようにしたいと思いますassets library(そして、以下のコードチャンクはこれをうまく行います)。

ただし、このdataSourceメソッドで を返す必要がありUIImageますが、アセット ライブラリ メソッドを使用して画像を取得すると、結果ブロックで画像が返されます。単純に結果ブロックを入れるだけreturn imageでは、明らかに機能しません。

UIImage結果ブロック内からメソッドを返す方法を知っている人はいますか? ブロック内で画像を返すことについて、他のいくつかの SO の質問を見てきましたが、それらは別のメソッドを呼び出すと言われています。残念ながら、このメソッドは UIImage を返さなければならない Nimbus データソース メソッドであるため、これを行うことはできませ

どんな助けやアドバイスも大歓迎です!以下のコード:

- (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 は、シリアル ディスパッチ キュー (キューと呼ばれる) を作成します。
  • datasource は [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 に答える