如何在swift中使用线程?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
Run Code Online (Sandbox Code Playgroud) 我正在使用SKTAudioRay Wenderlich在他的Github上提供的库.这是我为播放声音效果而修改的代码,我每次播放时都会调用它:
public func playSoundEffect(_ filename: String) {
let url = Bundle.main.url(forResource: filename, withExtension: nil)
if (url == nil) {
print("Could not find file: \(filename)")
return
}
if !UserDefaults.standard.bool(forKey: "soundOff"){
var error: NSError? = nil
do {
soundEffectPlayer = try AVAudioPlayer(contentsOf: url!)
} catch let error1 as NSError {
error = error1
soundEffectPlayer = nil
}
if let player = soundEffectPlayer {
DispatchQueue.global(qos: .background).async {
player.numberOfLoops = 0
player.prepareToPlay()
player.play()
}
} else {
print("Could not create audio …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Swift 5 中的 AVAudioPlayer 实例从后台线程播放声音。大多数时候,它会成功。但有时音频播放器无法播放声音。
\n\n看起来好像连续调用 play() 两次,或者调用prepareToPlay() 然后连续调用 play() 以某种方式解决了问题,但这对我来说似乎不是一个好的解决方案,因为我担心这仍然不能解决问题不保证一定能播放成功。
\n\nfunc setUpAudio() {\n AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)\n try! AVAudioSession.sharedInstance().setActive(true)\n NotificationCenter.default.addObserver(self, selector: #selector(handleInterruption), name: AVAudioSession.interruptionNotification, object: nil)\n}\n\nfunc startNewAudio() {\n let destinationData = Destinations.getDestinations()\n var audio = destinationData[currentStop]!["audio"] as! String\n if inTransit {\n audio = destinationData[Paths.tourOrder[currentIndex + 1]]!["transit_audio"] as! String\n }\n let sound = NSURL(fileURLWithPath: Bundle.main.path(forResource: audio, ofType: "mp3", inDirectory: "audio")!)\n try! audioPlayer = AVAudioPlayer(contentsOf: sound as URL)\n audioPlayer.delegate = self\n currentTime = 0\n setPlay()\n}\n\nfunc setPlay() {\n paused = …Run Code Online (Sandbox Code Playgroud)