Swift - Как получить формат .Mov? - PullRequest
0 голосов
/ 09 января 2019

Я нашел много решений по загрузке видео или изображений, используя

phfetchOptions.predicate = NSPredicate(format : "mediaType = %d" , PHAssetMediaType.video.rawvalue)

Также есть PHAssetMediaSubtype, который сильно отличается от того, что я ищу.

Как точно получить количество файлов .Mov из всех других форматов внутри PHAsset

Я подошел к решению, но думаю, что это неправильный способ подсчета. Количество видео, создающих количество фоновых вызовов, вместо этого процесс должен выполняться внутри одного асинхронного вызова. Есть предложения?

 private func getMovVideosCount() {

    let fetchOptions = PHFetchOptions()

    fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.video.rawValue)
    var count : Int = 0
    let imagesAndVideos = PHAsset.fetchAssets(with: fetchOptions)
    for i in 0..<imagesAndVideos.count {
        let videoRequestOptions = PHVideoRequestOptions()
        PHImageManager.default().requestPlayerItem(forVideo: imagesAndVideos[i], options: videoRequestOptions) { (playerItem, result) in
            let currentVideoUrlAsset = playerItem?.asset as?  AVURLAsset
            if let currentVideoFilePAth = currentVideoUrlAsset?.url{
                let lastObject = currentVideoFilePAth.pathExtension
                if lastObject == "MOV" {
                    count += 1
                }
            }
            print(Thread.isMainThread) // false 
        }
    }
    print(Thread.isMainThread) // true
}

1 Ответ

0 голосов
/ 11 января 2019

Это решение дает счетчик .MOV и решает проблемы параллелизма с группой диспетчеризации.

private func getMovVideosCount() {

let fetchOptions = PHFetchOptions()
let dispatchgroup = DispatchGroup()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.video.rawValue)
var count : Int = 0
let imagesAndVideos = PHAsset.fetchAssets(with: fetchOptions)
for i in 0..<imagesAndVideos.count {
    dispatchgroup.start()
    let videoRequestOptions = PHVideoRequestOptions()
    PHImageManager.default().requestPlayerItem(forVideo: imagesAndVideos[i], options: videoRequestOptions) { (playerItem, result) in
        let currentVideoUrlAsset = playerItem?.asset as?  AVURLAsset
        if let currentVideoFilePAth = currentVideoUrlAsset?.url{
            let lastObject = currentVideoFilePAth.pathExtension
            if lastObject == "MOV" {
                count += 1
            }
        }
        print(Thread.isMainThread) // false 
      dispatchgroup.leave()
    }
}
dispatchgroup.notify({})
print(Thread.isMainThread) // true

}

...