2016-10-30 5 views
1
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) 

} 

У меня есть код выше в моем быстром проекте. Мой проект выходит из строя в самый первый раз, когда я запустить проект в симуляторе на self.buttonTapPlayer.play() со следующей ошибкой:Thread1: EXC_BAD_ACCESS (код = 1, адрес = 0X48) при нажатии кнопки

Thread1:EXC_BAD_ACCESS(code=1, address = 0X48)

Однако, когда я повторно запустить его, все хорошо. Как это разрешить?

+0

я просто проверял код .. у вас есть проблемы создания SEGUE идентификатор ... – Joe

+0

@ Coder221 Is проблема все еще существует, если вы не отправляете эти три строки в метод 'viewDidLoad'? – alexburtnik

ответ

1

Вы не можете этого сделать. Вы создали свой buttonTapPlayer в фоновом потоке, и вы пытаетесь вызвать его из основного потока (до метода IBAction). Компилятор разбился до play(), потому что ваш плеер еще не готов.

Чтобы избежать этого, вы можете создать свой плеер внутри:

DispatchQueue.main.async { 
    // build your stuff to the main thread 
} 

или просто удалить DispatchQueue.global(qos: .background).async {}

+0

Цените объяснение, я построил его в DispatchQueue.main.async {}, он отлично работает. – Coder221

Смежные вопросы