PHFetchResult 获取所有照片并按日期排序不一致
PHFetchResult get all photos and sort by date inconsistent
我正在尝试构建一个简单的照片选择器,目前有两个选项:“最近”和“收藏夹”。我正在做的是尝试通过 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];
}
}
}
}
我自己解决了这个问题,这是我的解决方案:
- (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];
}
}
我正在尝试构建一个简单的照片选择器,目前有两个选项:“最近”和“收藏夹”。我正在做的是尝试通过 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];
}
}
}
}
我自己解决了这个问题,这是我的解决方案:
- (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];
}
}