2012-05-13 9 views
0

保存された写真アルバムから特定の条件に一致するすべての画像の配列を作成しようとしています。ここでは簡単なコードを示します。 myImages配列に写真を追加し、 "Added Image"ログで正しい画像が記録されることを確認します。しかし、関数が返す配列は常に空です。 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; 

答えて

0

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

オプション1:メソッドをパラメーターとして完了ブロックにしてから、enumerateGroupsWithTypesブロック内の補完ブロックを呼び出し、完了ブロックを配列に渡します。たとえば、次のように、その後

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

あなたは成功の呼び出しで行われている:

completionBlock(myImages, nil); 

とfailureBlock通話中:

completionBlock(nil, error); 

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

+0

はい、imagesTakenOnDateはmyImagesである必要があります。私はあなたの提案を読んで、それを試みます。ありがとう! – vishwa

0

最初のこと。あなたは本当にimagesTakenOnDateを返しますか?あなたのコードでこのivarへの参照を見ることができません。私はあなたのコードにいくつかのブレークポイントを置くと言います。 gdbデバッガコンソールで、次のように入力してください。

po myImages 

デバッガがあなたの配列の内容を出力します。希望があれば

関連する問題