fetchAssetCollectionsWithType を呼び出すと、ほとんどのコレクション タイプで適切に並べ替えられた結果を取得するのに問題はありません。例えば:
fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"localizedTitle" ascending:YES],];
PHFetchResult *topLevelUserCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:fetchOptions];
すべてのアルバムを正しく並べ替えますが、並べ替え順序を逆にすると、逆の結果が得られます。
PHAssetCollectionTypeSmartAlbum に対して同じことを行うと、次のようになります。
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"localizedTitle" ascending:YES],];
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];
結果は毎回同じ順序ですが、特定の順序で返されるわけではありません。順序を逆にしたり、ソート記述子を「endDate」などの別のものに変更したりしても、結果には影響しません。アイテムが実際に次のようなプロパティを持っていることを確認しました。
for (PHAssetCollection *aSmartAlbum in smartAlbums){
NSLog(@"localizedTitle - %@, estimatedCount - %u", aSmartAlbum.localizedTitle, (int)(aSmartAlbum.estimatedAssetCount == NSNotFound ? 0 : aSmartAlbum.estimatedAssetCount));
}
これにより、次のようなログが生成されます。 - 0 localizedTitle - すべての写真、推定カウント - 0 localizedTitle - 非表示、推定カウント - 0 localizedTitle - 最近追加された、推定カウント - 0
正しくソートされた人はいますか?
基本的に、結果を配列に取り込んでソートすることになりました。たまたまカメラロールとお気に入りが最初に欲しいだけです。
PHFetchOptions *fetchOptions = [PHFetchOptions new];
PHFetchResult* unorderedSmart = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];
PHAssetCollection* allPhotos;
PHAssetCollection* favorites;
NSMutableArray* orderedSmart = [NSMutableArray array];
for (PHAssetCollection *aSmartAlbum in unorderedSmart){
if (aSmartAlbum.assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumUserLibrary) {
allPhotos = aSmartAlbum;
}else if (aSmartAlbum.assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumFavorites){
favorites = aSmartAlbum;
}else{
[orderedSmart addObject:aSmartAlbum];
}
}
[orderedSmart sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
PHAssetCollection* ac1 = obj1;
PHAssetCollection* ac2 = obj2;
return [ac1.localizedTitle localizedCaseInsensitiveCompare:ac2.localizedTitle];
}];
if (favorites) {
[orderedSmart insertObject:favorites atIndex:0];
}
if (allPhotos) {
[orderedSmart insertObject:allPhotos atIndex:0];
}