estimatedAssetCount返回错误的计数

时间:2016-02-20 09:28:49

标签: ios swift count photokit phassetcollection

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

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创建的相册,例如相机胶卷。对于用户创建的常规相册,将返回正确的值。我做错了什么或这是一个错误吗?

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

3 个答案:

答案 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
    }
}