0

特定の基準に一致する、保存されたフォト アルバムからすべての画像の配列を作成しようとしています。これは、そのための単純化されたコードです。写真を myImages 配列に追加し、「追加された画像」ログを介して、正しい画像がログに記録されることを確認しました。ただし、関数によって返される配列は常に空です。Objective-C にはかなり新しいので、どんな提案も役に立ちます。

NSMutableArray * myImages = [NSMutableArray array];

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

// Enumerate just the photos by using ALAssetsGroupSavedPhotos.
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

    // Within the group enumeration block, filter to enumerate just photos.
    [group setAssetsFilter:[ALAssetsFilter allPhotos]];

    [group enumerateAssetsUsingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) {

                             // The end of the enumeration is signaled by asset == nil.
                             if (alAsset) {
                                 ALAssetRepresentation *representation = [alAsset defaultRepresentation];
                                 UIImage *latestPhoto = [UIImage imageWithCGImage:[representation fullResolutionImage]];

                                     NSLog(@"Added Image");
                                     [myImages addObject:latestPhoto];
                             }
                         }];
                    }
                     failureBlock: ^(NSError *error) {
                         // Typically you should handle an error more gracefully than this.
                         NSLog(@"No groups");
                     }];

return myImages;
4

2 に答える 2

0

初めにすること。本当に imagesTakenOnDate を返しますか? コードでこの ivar への参照を確認できません。コードにいくつかのブレークポイントを入れたと思います。gdb デバッガー コンソールでは、次のように入力できます。

po myImages

デバッガーが配列の内容を出力するよりも。それが役立つことを願っています

于 2012-05-13T08:18:31.730 に答える
0

imagesTakenOnDate とは何ですか? それはmyImagesであるはずですか?その場合、メソッドが返された後にブロック コードが実行されるため、この方法で返すことはできません。メソッドは非同期です。「戻る」のではなく、関数の外部で変更された配列にアクセスできるようにするための 2 つのオプションがあります。

オプション 1: メソッドに完了ブロックをパラメーターとして取り、enumerateGroupsWithTypes ブロック内で完了ブロックを呼び出し、完了ブロックに配列を渡します。例えば:

typedef void (^CompletionBlock)(id, NSError*);
-(void)myMethodWithCompletionBlock:(CompletionBlock)completionBlock;

次に、成功の呼び出しが完了したら:

completionBlock(myImages, nil);

そして、failureBlock 呼び出しでは:

completionBlock(nil, error);

オプション 2: 配列を、ローカル変数ではなく、親オブジェクトに保持される ivar にしてから、__block 変数として宣言して、ブロック内で変更できるようにします。

于 2012-05-13T08:19:53.763 に答える