用于访问 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)
虽然我真的不明白你为什么要同步做。
是否有任何方法可以获取不涉及异步 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)
虽然我真的不明白你为什么要同步做。