0

このコードを使用してデバイスからすべての画像を取得していますが、結果が返されません

- (void)viewDidLoad
{
    [super viewDidLoad];
    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
        if(result != NULL) {
            NSLog(@"See Asset: %@", result);
            [_assets addObject:result];
            // Here storing the asset's image URL's in NSMutable array urlStoreArr
            NSURL *url = [[result defaultRepresentation] url];
            [_urlStoreArr addObject:url];
        }
    };

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop)
    {
        if(group != nil)
        {
            [group enumerateAssetsUsingBlock:assetEnumerator];
        }
    };

    _urlStoreArr = [[NSMutableArray alloc] init];
    _assets = [[NSMutableArray alloc] init];
    _library = [[ALAssetsLibrary alloc] init];

    [_library enumerateGroupsWithTypes:ALAssetsGroupAlbum
                           usingBlock:assetGroupEnumerator
                         failureBlock: ^(NSError *error) {
                             NSLog(@"Failure");
                         }];



    [self UploadImagesToServer];

}

-(void) UploadImagesToServer
{
    for (int i=0; i<[_urlStoreArr count]; i++)
    {
        // To get the each image URL here...

        NSString *str = [_urlStoreArr objectAtIndex:i];
        NSLog(@"str: %@",str);

        // Need to upload the images to my server..
    }
}
4

1 に答える 1

2

初期化する前に使用して_urlStoreArrいます。

ブロックを定義すると、ブロックで使用する変数の現在のローカル値が取得されます。

したがって、assetEnumerator使用しているブロック_urlStoreArrでは、コードの後半まで初期化していません。

_urlStoreArr先頭にアンダースコアがあるため、iVar であると想定しています。ARC を使用している場合、iVar は に初期化されるnilため、assetEnumeratorブロックは にメッセージを送信していますnil。これは Objective-C では合法ですが、 を返すだけnilです。

これを修正するには、2 つのオプションがあります。

  1. の宣言をブロック_urlStoreArr = [[NSMutableArray alloc] init];の定義の上に移動しますassetEnumerator
  2. 推奨される方法 - iVar を直接使用せず、プロパティ構文を使用します。[_urlStoreArr addObject:url];つまり、試すのではなく[self.urlStoreArr addObject:url];。これが機能するのは、プロパティ アクセスを使用する場合_urlStoreArr、定義時に現在の値を使用するのではなく、iVar が初期化された後のブロックの実行時に値を使用するためです。
于 2012-12-17T08:58:44.560 に答える