我正在使用PHCachingImageManager().requestAVAsset从摄像机卷加载一些视频:

 override func viewDidLoad() {
    super.viewDidLoad()
    print("SEGUE SUCCESSFUL")
    view.backgroundColor = .black
    avPlayerLayer = AVPlayerLayer(player: avPlayer)
    view.layer.insertSublayer(avPlayerLayer, at: 0)

    var asset2:AVAsset? = nil

    PHCachingImageManager().requestAVAsset(forVideo: (vidLocation?[videoSender]!)!, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) in
        asset2 = asset! as AVAsset
        })


    let playerItem = AVPlayerItem(asset: asset2!)
    avPlayer.replaceCurrentItem(with: playerItem)
}

但是,当我运行程序时,它会在PHCachingImageManager().requestAVAsset行处暂停并显示:
线程1:EXC_断点
(以绿色突出显示)
我不确定发生了什么,在文档中找不到我理解的任何东西。我该怎么解决?

最佳答案

有几件事你会想在这里做,以使这项工作。
您需要将PHCachingImageManager缓存为将保持活动状态的对象的属性。如果只是创建它而不将其存储在某个地方,那么ARC规则将导致它被丢弃。在下面的代码中,我使用了一个lazy var,但这并不是唯一的方法。
您应该消除代码中所有强制展开的选项!。使用guard let ...if let ...模式可能会让你感觉更像是在打字,但最终会节省你很多时间和挫败感。把!看作是一个危险标志,上面写着“在这里坠毁!”.
您需要从AVPlayerItem完成块设置resultHandlerrequestAVAsset是异步的,因此它不会阻塞您的主线程,同时它会执行检索您的资产的潜在的昂贵工作。基本上,只要调用requestAVAsset就有一个单独的线程为您工作,而主线程继续处理viewDidLoad方法中的其余代码。当它成功地检索到AVAsset时,它会调用您最初提供的代码块(在主线程上),以便您可以继续处理。
下面是你的代码重写,以包含我建议的更改:

lazy var imageManager = {
    return PHCachingImageManager()
}()

override func viewDidLoad() {
    super.viewDidLoad()
    print("SEGUE SUCCESSFUL")
    view.backgroundColor = .black
    avPlayerLayer = AVPlayerLayer(player: avPlayer)
    view.layer.insertSublayer(avPlayerLayer, at: 0)

    var asset2:AVAsset? = nil
guard let phAsset = vidLocation?[videoSender] else { return } //No video

imageManager.requestAVAsset(forVideo: phAsset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) in
    if let avAsset = asset {
        self.play(asset: avAsset)
    }
})

func play(asset: AVAsset) {
    let playerItem = AVPlayerItem(asset: asset)
    avPlayer.replaceCurrentItem(with: playerItem)
}

如果有什么不清楚的地方请告诉我。

关于swift - 使用PHCachingImageManager()。requestAVAsset时崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41812398/

10-11 01:28