PHFetchResult获取所有照片并按日期排序不一致

7
我正在尝试构建一个简单的相片选择器,目前有两个选项:最近和收藏。我正在尝试通过creationDate获取所有照片,但是我的数据源返回的顺序不正确。开始的数据源中有几年前的照片,而散布在其中的照片则小于几分钟。我认为问题在于我需要首先告诉主要的fetchResult排序顺序,但我不认为这是可能的:Unsupported sort descriptor in fetch options: (creationDate, ascending, compare: 如有帮助,将不胜感激。代码:
@property (nonatomic, strong) NSMutableOrderedSet *recentsDataSource;
@property (nonatomic, strong) NSMutableOrderedSet *favoritesDataSource;

- (void)setup
{
    PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum | PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];

    for (PHAssetCollection *sub in fetchResult)
    {
        PHFetchOptions *fetchOptions = [[PHFetchOptions alloc]init];

        fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

        PHFetchResult *assetsInCollection = [PHAsset fetchAssetsInAssetCollection:sub options:fetchOptions];

        for (PHAsset *asset in assetsInCollection)
        {
            [self.recentsDataSource addObject:asset];

            if (asset.isFavorite)
            {
                [self.favoritesDataSource addObject:asset];
            }
        }
    }
}
1个回答

8
我自己想出了解决方法,以下是我的方案:
- (void)setup
{
    self.recentsDataSource = [[NSMutableOrderedSet alloc]init];
    self.favoritesDataSource = [[NSMutableOrderedSet alloc]init];

    PHFetchResult *assetCollection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum | PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];

    PHFetchResult *favoriteCollection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumFavorites options:nil];

    for (PHAssetCollection *sub in assetCollection)
    {
        PHFetchResult *assetsInCollection = [PHAsset fetchAssetsInAssetCollection:sub options:nil];

        for (PHAsset *asset in assetsInCollection)
        {
            [self.recentsDataSource addObject:asset];
        }
    }

    if (self.recentsDataSource.count > 0)
    {
        NSArray *array = [self.recentsDataSource sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]];

        self.recentsDataSource = [[NSMutableOrderedSet alloc]initWithArray:array];
    }

    for (PHAssetCollection *sub in favoriteCollection)
    {
        PHFetchResult *assetsInCollection = [PHAsset fetchAssetsInAssetCollection:sub options:nil];

        for (PHAsset *asset in assetsInCollection)
        {
            [self.favoritesDataSource addObject:asset];
        }
    }

    if (self.favoritesDataSource.count > 0)
    {
        NSArray *array = [self.favoritesDataSource sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]];

        self.favoritesDataSource = [[NSMutableOrderedSet alloc]initWithArray:array];
    }
}

PHFetchResult不符合Sequence协议,因此我们无法在for..in语句中使用它。 - saiday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接