【问题标题】:PHFetchResult get all photos and sort by date inconsistentPHFetchResult 获取所有照片并按日期排序不一致
【发布时间】:2015-08-16 15:27:21
【问题描述】:

我正在尝试构建一个简单的照片选择器,目前有两个选项:最近和收藏夹。我正在做的是试图通过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];
            }
        }
    }
}

【问题讨论】:

    标签: ios objective-c photosframework phphotolibrary phfetchoptions


    【解决方案1】:

    这是我自己想出来的,这是我的解决方案:

    - (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 不符合协议序列,因此我们不能在 for .. in 语句中使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多