视频 URL pathExtension 找不到 nil
Video URL pathExtension find nil
我正在获取数组中的所有图像和视频作为 PHAsset,然后尝试获取它们的 URL。在代码的下一部分中,我试图获得 URL 路径扩展,但在这一行中我遇到了错误。我的代码如下:
var imagesAndVideos: PHFetchResult<PHAsset>!
let asset = imagesAndVideos!.object(at: indexPath.row)
func grabPhotos(){
let imgManager = PHImageManager.default()
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchOptions.predicate = NSPredicate(format: "mediaType == %d || mediaType == %d",
PHAssetMediaType.image.rawValue,
PHAssetMediaType.video.rawValue)
imagesAndVideos = PHAsset.fetchAssets(with: fetchOptions)
}
var ext:String!
var url:NSURL!
imgManager.requestAVAsset(forVideo: asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) in
DispatchQueue.main.async(execute: {
let myAsset = asset as! AVURLAsset
url = myAsset.url as NSURL
self.photoLibraryVideoUrl.append(url)
let videoData = NSData(contentsOf : url as URL)
self.videoDataArray.append(videoData!)
})
})
ext = "."+url.pathExtension!
self.nameArray.append(dateStringForFolder+ext)
这行显示 url 为 nil:
ext = "."+url.pathExtension!
这个错误不是每次都显示。我认为 (ext = "."+url.pathExtension!) 代码在 url 获得价值之前执行。我怎么解决这个问题?
requestAVAsset
是一个异步函数,一旦执行完成就会调用闭包。所以 ext = "."+url.pathExtension!
和 self.nameArray.append(dateStringForFolder+ext)
甚至可以在 requestAVAsset
完成闭包执行之前执行。您必须将代码移动到闭包内。
imgManager.requestAVAsset(forVideo: asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) in
DispatchQueue.main.async(execute: {
let myAsset = asset as! AVURLAsset
url = myAsset.url as NSURL
self.photoLibraryVideoUrl.append(url)
let videoData = NSData(contentsOf : url as URL)
self.videoDataArray.append(videoData!)
ext = "."+url.pathExtension!
self.nameArray.append(dateStringForFolder+ext)
})
})
我正在获取数组中的所有图像和视频作为 PHAsset,然后尝试获取它们的 URL。在代码的下一部分中,我试图获得 URL 路径扩展,但在这一行中我遇到了错误。我的代码如下:
var imagesAndVideos: PHFetchResult<PHAsset>!
let asset = imagesAndVideos!.object(at: indexPath.row)
func grabPhotos(){
let imgManager = PHImageManager.default()
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchOptions.predicate = NSPredicate(format: "mediaType == %d || mediaType == %d",
PHAssetMediaType.image.rawValue,
PHAssetMediaType.video.rawValue)
imagesAndVideos = PHAsset.fetchAssets(with: fetchOptions)
}
var ext:String!
var url:NSURL!
imgManager.requestAVAsset(forVideo: asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) in
DispatchQueue.main.async(execute: {
let myAsset = asset as! AVURLAsset
url = myAsset.url as NSURL
self.photoLibraryVideoUrl.append(url)
let videoData = NSData(contentsOf : url as URL)
self.videoDataArray.append(videoData!)
})
})
ext = "."+url.pathExtension!
self.nameArray.append(dateStringForFolder+ext)
这行显示 url 为 nil:
ext = "."+url.pathExtension!
这个错误不是每次都显示。我认为 (ext = "."+url.pathExtension!) 代码在 url 获得价值之前执行。我怎么解决这个问题?
requestAVAsset
是一个异步函数,一旦执行完成就会调用闭包。所以 ext = "."+url.pathExtension!
和 self.nameArray.append(dateStringForFolder+ext)
甚至可以在 requestAVAsset
完成闭包执行之前执行。您必须将代码移动到闭包内。
imgManager.requestAVAsset(forVideo: asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) in
DispatchQueue.main.async(execute: {
let myAsset = asset as! AVURLAsset
url = myAsset.url as NSURL
self.photoLibraryVideoUrl.append(url)
let videoData = NSData(contentsOf : url as URL)
self.videoDataArray.append(videoData!)
ext = "."+url.pathExtension!
self.nameArray.append(dateStringForFolder+ext)
})
})