我需要显示带有图像数量的相机胶卷相册。我正在使用以下代码来获取相机卷册。
let smartCollections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumUserLibrary, options: nil)
smartCollections.enumerateObjectsUsingBlock { object, index, stop in
if let collection = object as? PHAssetCollection {
print(collection.estimatedAssetCount)
}
}
我在照片应用中的相机胶卷中只有28张图片。但estimatedAssetCount
属性返回值9223372036854775807!
这仅适用于OS创建的相册,例如相机胶卷。对于用户创建的常规相册,将返回正确的值。我做错了什么或这是一个错误吗?
如果是,是否有其他方法可以获得正确的图像数量?
答案 0 :(得分:7)
应该看得更久一点。进入PHAssetCollection
的头文件会显示这一小段信息。
这些数字只是估计数;返回的实际对象数 如果您关心准确性,应该使用提取。返回 NSNotFound如果无法快速返回计数。
所以我猜这是预期的行为而不是错误。所以我在下面添加了这个扩展方法,以获得正确的图像计数,并且它可以工作。
extension PHAssetCollection {
var photosCount: Int {
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.Image.rawValue)
let result = PHAsset.fetchAssetsInAssetCollection(self, options: fetchOptions)
return result.count
}
}
答案 1 :(得分:2)
9223372036854775807
是某些系统上NSNotFound
的值。 PHAssetCollection
的文档提到,如果无法返回计数,它可能会返回NSNotFound
。
如果您只想在必要时求助,则应检查NSNotFound
:
let smartCollections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumUserLibrary, options: nil)
smartCollections.enumerateObjectsUsingBlock { object, index, stop in
guard let collection = object as? PHAssetCollection else { return }
var assetCount = collection.estimatedAssetCount
if assetCount == NSNotFound {
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.Image.rawValue)
assetCount = PHAsset.fetchAssetsInAssetCollection(collection, options: fetchOptions).count
}
print(assetCount)
}
答案 2 :(得分:0)
@Isuru的答案对Swift 5稍作修改
extension PHAssetCollection {
var photosCount: Int {
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.image.rawValue)
let result = PHAsset.fetchAssets(in: self, options: fetchOptions)
return result.count
}
var videoCount: Int {
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.video.rawValue)
let result = PHAsset.fetchAssets(in: self, options: fetchOptions)
return result.count
}
}