2016-02-20 10 views
3

Мне нужно отобразить альбом с рулонной камерой с количеством изображений в нем. Я использую приведенный ниже код, чтобы получить альбом с кадром.оцененныйAssetCount возвращает неверный счет

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!

Это происходит только для созданных ОС, таких как рулон камеры. Для пользовательских обычных альбомов возвращается правильное значение. Я делаю что-то неправильно или это ошибка?

Если это так, есть ли другой способ получить правильное количество изображений?

ответ

3

Должно было выглядеть немного дольше. Переход к файлу заголовка 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 
    } 
} 
+0

Работа отлично! –

1

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) 
}