PHFetchOptions可用的NSSortDescriptors有哪些?如何查找有效排序键
如何查找PhotoKit中PHFetchOptions可用的排序描述符键值
1. 直接参考PHAsset的公开属性
PHFetchOptions的sortDescriptors支持的键,本质就是PHAsset类的公开属性名。你可以直接在Xcode中按住Option点击PHAsset跳转查看类定义,所有公开属性都能作为排序键使用:
- 按最后修改日期排序:用
modificationDate作为keylet allPhotosOptions = PHFetchOptions() allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "modificationDate", ascending: false)] - 其他常用键:
pixelWidth/pixelHeight(按分辨率排序)、duration(视频时长,仅适用于视频资源)、favorite(按是否收藏排序)等。
2. 文件大小排序的特殊处理
PHAsset没有直接暴露文件大小属性,没法直接用sortDescriptors排序,需要手动获取资源大小后再排序:
// 先获取目标资源集合 let allPhotosOptions = PHFetchOptions() let allPhotos = PHAsset.fetchAssets(with: .image, options: allPhotosOptions) // 遍历asset,关联对应的文件大小 var assetSizePairs: [(asset: PHAsset, size: Int64)] = [] allPhotos.enumerateObjects { asset, _, _ in let resources = PHAssetResource.assetResources(for: asset) // 累加所有资源的文件大小(部分资源可能包含缩略图等,按需调整) let totalSize = resources.reduce(Int64(0)) { sum, resource in sum + (resource.value(forKey: "fileSize") as? Int64 ?? 0) } assetSizePairs.append((asset: asset, size: totalSize)) } // 按文件大小降序排序,提取出排序后的asset数组 let sortedAssets = assetSizePairs.sorted { $0.size > $1.size }.map { $0.asset }
3. 验证键值有效性的小技巧
如果不确定某个属性能不能作为排序键,直接写进去测试即可——如果键无效,Xcode运行时会抛出明确的错误提示,告诉你哪些键是合法的。
内容的提问来源于stack exchange,提问作者Offswitch
相关产品推荐
相关产品推荐

