Как исправить проблему пустых активов с помощью PHImageManager в AssetsPickerController iOS? - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю над AssetsPickerController в Swift, чтобы выбрать несколько Videos из Device gallery.

Проблема: Когда я выбираю несколько Videos или иногда один video, иногда мой App падает из-за пустого Video Asset. Это происходит 5-10 раз из 100 раз тестирования.

Код:

@IBAction func openAssetsAction(_ sender: UIButton) {
        let rootListAssets = AssetsPickerController()
        rootListAssets.didSelectAssets = {(assets: Array<PHAsset?>) -> () in

            for i in 0..<assets.count {

                let myPHAsset = assets[i]

                let options = PHVideoRequestOptions()
                options.deliveryMode = .highQualityFormat
                options.isNetworkAccessAllowed = true

                options.progressHandler = {  (progress, error, stop, info) in
                    print("progress: \(progress)")
                }

                PHImageManager.default().requestAVAsset(forVideo: myPHAsset!, options: options, resultHandler: { (asset, audioMix, info) in
                    if let urlAsset = asset as? AVURLAsset {
                        let localVideoUrl = urlAsset.url
                        print(localVideoUrl)
                    }
                })
            }
        }

        let navigationController = UINavigationController(rootViewController: rootListAssets)
        present(navigationController, animated: true, completion: nil)
    }

Я приложил все усилия, чтобы найти аналогичную проблему в StackOverFlow, и получил несколько, они предлагают использовать isNetworkAccessAllowed, но после установки isNetworkAccessAllowed все равно я получаю ноль Asset.

1 Ответ

0 голосов
/ 03 апреля 2019

Во-первых, вы не должны принудительно развертывать актив здесь forVideo: myPHAsset!

guard 
  let myPHAsset = assets[i] 
else { 
  return 
}

Затем попробуйте установить автоматический режим доставки:

options.deliveryMode = .automatic

EDIT:

Чтобы принудительно загрузить актив, нам нужно указать версию:

options.version = .original
...