首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AlAssetLibrary返回空结果

AlAssetLibrary返回空结果
EN

Stack Overflow用户
提问于 2012-11-09 06:23:58
回答 3查看 2.2K关注 0票数 1

我在试着找出一些胶片的元数据。当我枚举资产时,我似乎无法检索任何信息并获得一个空数组。我是不是漏掉了什么?

我的代码:

代码语言:javascript
复制
assets = [[NSMutableArray array] init]; 

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {
    if(asset != NULL) {
        [assets addObject:asset];
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    }
};

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

library = [[ALAssetsLibrary alloc] init];

[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos 
                       usingBlock:assetGroupEnumerator
                     failureBlock: ^(NSError *error) {
                         NSLog(@"Failed.");
                     }];    

NSLog(@"%@", assets); //prints an empty array
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-09 22:26:25

Midhun MP是正确的,您不是在等待异步枚举完成。在这种情况下,您有异步块调用其他异步块,因此要知道所有枚举何时完成并不简单。

如果您想知道何时完成此操作,并最终得到一个包含所有枚举资产的数组,则可以使用dispatch_groups。这里有一种方法可以做到这一点(我已经包含了多个ALAssetGroup类型,以表明它可以与多张专辑一起使用):

代码语言:javascript
复制
dispatch_group_t loadingGroup = dispatch_group_create();
NSMutableArray * assets = [[NSMutableArray array] init];
NSMutableArray * albums = [[NSMutableArray array] init];

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {
    if(index != NSNotFound) {
        [assets addObject:asset];
        dispatch_async(dispatch_get_main_queue(), ^{ });
    } else {
        dispatch_group_leave(loadingGroup);
    }
};


void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
    if(group != nil) {
        [albums addObject: group];
    } else {
         NSLog(@"Found %d albums", [albums count]);
         // album loading is done
        for (ALAssetsGroup * album in albums) {
            dispatch_group_enter(loadingGroup);
            [album enumerateAssetsUsingBlock: assetEnumerator];
        }
        dispatch_group_notify(loadingGroup, dispatch_get_main_queue(), ^{
            NSLog(@"DONE: ALAsset array contains %d elements", [assets count]);
        });
    }
};

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

[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos | ALAssetsGroupAlbum
                   usingBlock:assetGroupEnumerator
                 failureBlock: ^(NSError *error) {
                     NSLog(@"Failed.");
                 }];

(在本例中,将各种块添加到assetsalbums是安全的,因为枚举都发生在主线程上。)

票数 4
EN

Stack Overflow用户

发布于 2012-11-09 07:01:12

如果您在iOS 6上运行此应用程序,则可能是用户拒绝了您的应用程序访问资源库。如果是这种情况,则调用failureBlock

还要注意,usingBlock是异步调用的,因此您尝试记录assets还为时过早。应该将NSLog语句移到枚举块的末尾。

来自enumerateGroupsWithTypes:usingBlock:failureBlock:的文档

通过执行枚举块将结果逐个传递给调用者。

此方法是异步的。当枚举组时,可能会要求用户确认应用程序对数据的访问;但是,该方法会立即返回。您应该对enumerationBlock中的资源执行任何您想要的工作。

如果用户拒绝访问应用程序,或者如果不允许任何应用程序访问数据,则调用failureBlock。

票数 0
EN

Stack Overflow用户

发布于 2012-11-09 11:55:30

您的NSLog将始终显示一个空数组,因为NSLog语句将在完成异步枚举块之前工作。

解决方案:

首先检查你的图片库是否为空。然后在以下位置添加NSLog:

代码语言:javascript
复制
void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {
    if(asset != NULL) {
        [assets addObject:asset];
        NSLog(@"Asset : %@", asset);
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13298912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档