用于访问 PHAsset 对象的 URL 信息的同步方法

Synchronous method for accessing URL info for PHAsset objects

是否有任何方法可以获取不涉及异步 requests/processes 的 PHAsset URL?

我意识到在发出这样的请求时阻塞主线程是不行的,但是如果您要查询的资产数量很少,是否可以通过其他方式获取它们?

到目前为止,我发现获得资产 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

            })

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

                    let vidURL = asset as! AVURLAsset

                })

有没有什么方法可以在不使用异步方法的情况下做这样的事情?我只是在 PHAsset 的任何地方都没有看到 URL 属性,但可能遗漏了一些非常明显的东西。

我不相信有这样的 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)

虽然我真的不明白你为什么要同步做。