访问 PHAsset 对象的 URL 信息的同步方法
Posted
技术标签:
【中文标题】访问 PHAsset 对象的 URL 信息的同步方法【英文标题】:Synchronous method for accessing URL info for PHAsset objects 【发布时间】:2018-02-06 23:13:41 【问题描述】:是否有任何方法可以获取不涉及异步请求/进程的 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 属性,但可能会遗漏一些非常明显的东西。
【问题讨论】:
【参考方案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)
虽然我真的不明白你为什么要同步进行。
【讨论】:
感谢您的信息,非常感谢!使用上述解决方案,您实际上是在强制主线程等待处理程序完成,对吗? @AdjunctProfessorFalcon 是的。信号量保持它直到你调用信号量信号以上是关于访问 PHAsset 对象的 URL 信息的同步方法的主要内容,如果未能解决你的问题,请参考以下文章