使用多個AVAudioPlayer

import UIKit
import AVFoundation
/**
雖然可以使用多個AVAudioPlayer,但通常情況下爲了保證性能應該儘可能重用AVAudioPlayer
 1.用一個數組保存了所有的AVAudioPlayer對象
 2.索取AVAudioPlayer對象時他會先去查詢是否有空閒的AVAudioPlayer對象,如果找到則返回,節省資源
 3.如果沒有找到,要麼是相同URL(播放的相同聲音),要麼就是沒有空閒的AVAudioPlayer對象,這時候則會NEW一個新的AVAudioPlayer,當新的AVAudioPlayer播放完畢後,我們又可以重用它了。
*/

//存放所有的AVAudioPlayer,私有,外部不可見
private var players:[AVAudioPlayer] = []

class AVAudioPlayerPool: NSObject {

    //指定聲音文件URL,有空閒重用,沒空閒創建AVAudioPlayer
    func playerWithURL(url:URL) -> AVAudioPlayer? {
        
        //查找一個空閒的AVAudioPlayer
        let availabelPlayers = players.filter { (player) -> Bool in
            return player.isPlaying == false && player.url == url
        }
        
        //如果找到,返回AVAudioPlayer對象
        if let playerToUse = availabelPlayers.first{
            return playerToUse
        }
        
        //沒有找到,新建一個AVAudioPlayer對象
        do {
            let newPlayer = try AVAudioPlayer(contentsOf: url)
            players.append(newPlayer)
            return newPlayer
        } catch {
            print(error)
        }
        return nil
    }
}
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //使用方法
        if let url = Bundle.main.url(forResource: "test1", withExtension: "wav") {
            let player = AVAudioPlayerPool().playerWithURL(url: url)
            player?.play()
        }
    }


}

Demo-18 使用多個AVAudioPlayer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章