需要有关资产库的帮助

时间:2012-12-17 08:47:32

标签: ios alassetslibrary

我正在使用此代码从我的设备中检索所有图像,但它没有返回结果

- (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..
    }
}

1 个答案:

答案 0 :(得分:2)

您在初始化之前使用_urlStoreArr

当您定义块时,它们将获取您在块中使用的变量的当前本地值。

因此,在您使用assetEnumerator的{​​{1}}块中,但是您要在代码的后面部分对其进行初始化。

我假设_urlStoreArr是iVar,因为它有一个前导下划线。如果您使用的是ARC,则iVar会初始化为_urlStoreArr,因此您的nil阻止正在向assetEnumerator发送消息。这在Objective-C中是合法的,但它只返回nil

您有两种方法可以解决此问题。

  1. nil的声明移到_urlStoreArr = [[NSMutableArray alloc] init];
  2. 的定义之上
  3. 首选方式 - 不要直接使用iVar,请使用属性语法。即而不是assetEnumerator尝试[_urlStoreArr addObject:url];。这是有效的,因为在使用属性访问时,您在定义时没有使用[self.urlStoreArr addObject:url];的当前值,而是使用块运行时的值,即iVar初始化之后的值。 / LI>