6

我需要显示带有图像数量的相机胶卷相册。我正在使用下面的代码来获取相机胶卷相册。

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!

这只发生在操作系统创建的相册(如相机胶卷)上。对于用户创建的常规相册,返回正确的值。我做错了什么还是这是一个错误?

如果是,有没有其他方法可以获得正确的图像计数?

4

3 回答 3

12

应该看起来更长一点。进入头文件会PHAssetCollection显示这个小信息。

这些计数只是估计值;如果您关心准确性,则应使用从 fetch 返回的对象的实际计数。如果无法快速返回计数,则返回 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
    }
}
于 2016-02-20T09:39:28.890 回答
4

9223372036854775807NSNotFound某些系统上的值。文档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)
}
于 2017-11-30T02:59:59.297 回答
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
    }
}
于 2019-08-30T08:48:03.187 回答