Синхронный метод доступа к информации URL для объектов PHAsset

Существуют ли способы получения URL-адреса PHAsset, не связанные с асинхронными запросами/процессами?

Я понимаю, что блокировать основной поток при выполнении таких запросов нельзя, но если у вас есть небольшое количество активов для запроса, можно ли получить их каким-либо другим способом?

До сих пор единственными способами, которые я нашел для получения URL-адресов ресурсов, были такие вещи, как следующие:

somePHAssetObject.requestContentEditingInput(with: nil, completionHandler: {
                input, info in
                guard let input = input
                    else { fatalError("can't get info: \(info)") }

                let assetURL = input.audiovisualAsset as! AVURLAsset

            })

Or

    PHCachingImageManager().requestAVAsset(forVideo: SomePHAssetObject, options: nil, resultHandler: {
(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable: Any]?) in

                    let vidURL = asset as! AVURLAsset

                })

Есть ли способы сделать что-то подобное без асинхронного подхода? Я просто нигде не вижу свойство URL в PHAsset, но могу упустить что-то действительно очевидное.


person AdjunctProfessorFalcon    schedule 06.02.2018    source источник


Ответы (1)


Я не верю, что есть такой API, но вы можете заставить поток ждать обработчика с помощью семафора, например, для второго примера, который вы представили:

let semaphore = DispatchSemaphore(value: 0)
PHCachingImageManager().requestAVAsset(forVideo: SomePHAssetObject, options: nil, resultHandler: { (asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable: Any]?) in

    let vidURL = asset as! AVURLAsset

    semaphore.signal()
})

_ = semaphore.wait(timeout: DispatchTime.distantFuture)

Хотя я действительно не понимаю, почему вы хотите сделать это синхронно.

person Milan Nosáľ    schedule 06.02.2018
comment
Спасибо за информацию, очень признателен! С приведенным выше решением вы фактически заставляете основной поток ждать завершения обработчика, верно? - person AdjunctProfessorFalcon; 07.02.2018
comment
@AdjunctProfessorFalcon да. Семафор удерживает его, пока вы не вызовете сигнал семафора - person Milan Nosáľ; 07.02.2018