2017-09-17 23 views
0

PHImageManagerを使用して複数の画像を選択し、このように書いています。問題はそれがブロックであり、シーケンスが順不同であるということです(ユーザーが写真1,2,3を選択すると3,1,2を返すことがあります)。どのようにして順番に書くのでしょうか?iOS:PHImageManagerで選択した写真を順番に取得する

PHImageManager *manager = [PHImageManager defaultManager]; 

[manager requestImageForAsset:asset targetSize:PHImageManagerMaximumSize 
        contentMode:PHImageContentModeDefault 
         options:self.requestOptions 
       resultHandler:^(UIImage *image, NSDictionary *info){ 

        if (self.isToSelectSingleImage) { 
        self.mediaCollection = [NSMutableArray array]; 
        self.thumbnailCollection = [NSMutableArray array]; 
        } 
        [self addImageToMediaContainerWithImage:image.normalizedImage]; 
       }]; 

答えて

1

ダウンロードヘルパークラスを作成してAssetsDownloaderとすることができます。 基本的な考え方は、アセットの配列を取得し、再帰関数を使用してそれらをダウンロードすることです。

配列はすでに順序付けされたコレクションなので、まず最初のアセットをダウンロードします。アセットがダウンロードされるとすぐに、配列の次の項目を取り出してダウンロードします。

AssetsDownloader.h

@import Foundation; 
@import Photos; 

@interface AssetsDownloader : NSObject 

- (void)downloadAssets:(NSArray<PHAsset *> *)assets; 

@end 

AssetsDownloader.m

#import "AssetsDownloader.h" 

@implementation AssetsDownloader { 
    NSMutableArray<PHAsset *> *_assets; 
} 

- (void)downloadAssets:(NSArray<PHAsset *> *)assets { 
    _assets = [[NSMutableArray alloc] initWithArray: assets]; 
    PHAsset *firstAsset = assets.firstObject; 
    [self downloadAsset:firstAsset]; 
} 

- (void)downloadAsset:(PHAsset *)asset { 
    [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize 
               contentMode:PHImageContentModeDefault 
                options:nil 
              resultHandler:^(UIImage *image, NSDictionary *info){ 

               // Do what you have to with the asset 

               // Remove first object from your assets 
               [_assets removeObjectAtIndex:0]; 
               // Get the next asset from your assets 
               PHAsset *nextAsset = _assets.firstObject; 
               // Check if it exists 
               if(nextAsset) { 
                // Use the same function to dowloand the asset 
                [self downloadAsset:asset]; 
               } else { 
                // No more assets to download 
               } 
              }]; 
} 

@end 
+0

興味深いこの音。ありがとう。 –

関連する問題