访问 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 信息的同步方法的主要内容,如果未能解决你的问题,请参考以下文章

如何上传 PHAsset(仅限视频和图像)?

带有 PHAsset 的 SDWebImage

如何从视频 URL 获取视频的 PHAsset?

如何从 PHAsset 获取图像 URL?是不是可以使用 PHAsset URL 将图像保存到文档目录?

从 PHAsset 获取已编辑照片的 URL

使用本地图像 URL 或 UIIMage 获取 PHAsset?