var buttonTapPlayer = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.global(qos: .background).async {
do{
let correctSoundUrl: URL = URL(fileURLWithPath: Bundle.main.path(forResource: "buttonTap", ofType: "wav")!)
self.buttonTapPlayer = try AVAudioPlayer(contentsOf: correctSoundUrl)
self.buttonTapPlayer.prepareToPlay()
}
catch{}
}
}
@IBAction func buttonPressed(_ sender: UIButton) {
self.buttonTapPlayer.play()
performSegue(withIdentifier: "showDetail", sender: sender)
}
我在swift项目中有上面的代码。我的项目第一次在self.buttonTapPlayer.play()
模拟器中运行项目时崩溃了
出现以下错误:
线程1:EXC_BAD_ACCESS(代码= 1,地址= 0X48)
然而,当我重新运行它时,一切都很好。我该如何解决这个问题?
答案 0 :(得分:2)
你无法做到。您已在后台线程中构建了buttonTapPlayer
,并尝试从主线程(到IBAction
方法)调用它。编译器崩溃到play()
因为你的播放器还没有准备好。
为避免这种情况,您可以在内部构建播放器:
DispatchQueue.main.async {
// build your stuff to the main thread
}
或只是删除DispatchQueue.global(qos: .background).async {}