iOS - ALAssetsGroupPropertyName返回空专辑名称

时间:2015-07-09 10:52:23

标签: ios objective-c alassetslibrary

我正在尝试使用该相册名称检索所有相册名称和所有照片。我从[group valueForProperty:ALAssetsGroupPropertyName]获得的相册名称大部分都是正确的,但有一个专辑名称显示为(null)而且名为Favorites的专辑未显示。

专辑名称数组:

((null), Camera Roll, Last Import, Nissan Juke, Cam)

这是我的代码

-(void)getPhotosFromAssetsLibWithPhotoFilter:(NSString *)filterAlbumString
{
    _assets = [@[] mutableCopy];
    __block NSMutableArray *tmpAssets = [@[] mutableCopy];
    __block NSMutableArray *albumGroup = [@[] mutableCopy];
    ALAssetsLibrary *assetsLibrary = [PhotoLibViewController defaultAssetsLibrary];
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
    {
        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
        {
            if(result)
            {
                if (![filterAlbumString isEqualToString:@""])
                {
                    if ([[NSString stringWithFormat:@"%@", [group valueForProperty:ALAssetsGroupPropertyName]] isEqualToString:filterAlbumString])
                    {
                        [tmpAssets addObject:result];
                    }
                }
                else
                {
                    [tmpAssets addObject:result];
                }
            }
        }];

        [albumGroup addObject:[NSString stringWithFormat:@"%@", [group valueForProperty:ALAssetsGroupPropertyName]]];

        dispatch_async(dispatch_get_main_queue(), ^{

            if ([self respondsToSelector:@selector(retrievedPhotoLibrary:)])
            {
                NSArray *albumGroupReversed = [[albumGroup reverseObjectEnumerator] allObjects];
                [self retrievedPhotoLibrary:albumGroupReversed];
            }
        });

        self.assets = [[tmpAssets reverseObjectEnumerator] allObjects];

        [self.collectionView reloadData];
    } failureBlock:^(NSError *error) {
        NSLog(@"Error loading images %@", error);
    }];
}

我想知道为什么有一个(null)专辑名称以及专辑名称Favorites未显示的原因。

感谢。

1 个答案:

答案 0 :(得分:1)

枚举完成后,调用enumerationBlock并将组设置为nil,因此每次group为零时都要检查,并且仅在枚举时执行reloadData完成。正确的逻辑应如下所示:

[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
{
    if (group != nil) 
    {
        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
        {
            if(result)
            {
                if (![filterAlbumString isEqualToString:@""])
                {
                    if ([[NSString stringWithFormat:@"%@", [group valueForProperty:ALAssetsGroupPropertyName]] isEqualToString:filterAlbumString])
                    {
                        [tmpAssets addObject:result];
                    }
                }
                else
                {
                    [tmpAssets addObject:result];
                }
            }
        }];

        [albumGroup addObject:[NSString stringWithFormat:@"%@", [group valueForProperty:ALAssetsGroupPropertyName]]];        
    }  
    else 
    {
        dispatch_async(dispatch_get_main_queue(), ^{

            if ([self respondsToSelector:@selector(retrievedPhotoLibrary:)])
            {
                NSArray *albumGroupReversed = [[albumGroup reverseObjectEnumerator] allObjects];
                [self retrievedPhotoLibrary:albumGroupReversed];
            }
        });

        self.assets = [[tmpAssets reverseObjectEnumerator] allObjects];

        [self.collectionView reloadData];
    }
} failureBlock:^(NSError *error) {
    NSLog(@"Error loading images %@", error);
}];

对于Favorites,它是iOS8 PhotoKit中的新功能:

  

借助iOS 8,Apple为我们提供了PhotoKit,这是一个比AssetsLibrary更高效的现代框架,并提供允许应用程序与设备的照片库无缝协作的功能。

     

收藏和隐藏资产

     

要查看资产是否已标记为收藏或用户是否隐藏,只需检查PHAsset实例的收藏夹和隐藏属性。

     

另请参阅:The Photos Framework

因此,您必须通过Favorites框架显示PhotoKit,请查看官方示例项目:ExampleappusingPhotosframework.zip