【问题标题】:Swift 3 AVFoundation Stop previous AVAudioPlayerSwift 3 AVFoundation 停止以前的 AVAudioPlayer
【发布时间】:2018-08-22 18:03:34
【问题描述】:

我有一个名为 PlayerController 的视图控制器,当我转到 PlayerController 时,它会加载一个音频文件并将其放入 AVAudioPlayer 中,它们是一个播放按钮,用于播放 AVAudioPlayer。到目前为止,一切都很好。问题是如果我离开 PlayerController 并再次转到它,来自前一个 AVAudioPlayer 的音频仍在播放,在我的 viewWillAppear 方法中,我有这条线来阻止 AVAudioPlayer 播放,但它不起作用,它不会停止前一个AVAudioPlayer 从播放....我将如何完成我想要做的事情?我应该在我的 appDelegate 文件中定义 AVAudioPlayer 并从他们的文件中读取它吗?

这是我的 viewWillAppear 方法:

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)

    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: (#selector(PlayerController.updateTimer)), userInfo: nil, repeats: true)

    if(UserDefaults.standard.integer(forKey: "nowPlayingPost") == 0)
        {
            UserDefaults.standard.set(self.postid, forKey: "nowPlayingPost")

            audioSlider.setValue(0, animated: false)

            if(self.audio != nil && (self.audio?.isPlaying)!)
            {
                self.audio?.stop()
            }

        }
        else
        {
            audioSlider.value = Float((self.audio?.currentTime)!)

            self.audioSlider.maximumValue = Float((self.audio?.duration)!)

            self.postid = UserDefaults.standard.integer(forKey: "nowPlayingPost")

            if(self.audio?.isPlaying)!
            {
                self.playButton.setTitle("Stop", for: .normal)
            }
            else
            {

                if(self.audio?.currentTime == 0)
                {
                    self.playButton.setTitle("Play", for: .normal)
                }
                else
                {
                    self.playButton.setTitle("Resume", for: .normal)
                }
            }

        }


    Alamofire.request(audioUrl!).responseData { response in

                    do {

                        self.audio = try AVAudioPlayer(data: response.data!)
                        self.audio?.prepareToPlay()

                        self.audioSlider.maximumValue = Float((self.audio?.duration)!)

                    }catch{

                    }
                }


}

那么我应该在 appDelegate 中定义 AVAudioPlayer 还是使用 UserDefaults 或 CoreData 或其他什么?这方面的最佳做法是什么?

【问题讨论】:

    标签: ios swift avfoundation avaudioplayer


    【解决方案1】:

    我认为最好的解决方案是使用类 Singleton 来控制您的音频功能,这样您就不会创建需要停止且不需要复杂的通知中心的 AVAudioPlayer 的另一个实例。您还可以从任何视图控制器访问 Singleton,并添加从 Alamofire 检索音频数据的方法,这样您就不需要通过 segue 传递数据或使用 NSUserDefaults。

    class AudioController {
        static let sharedInstance = AudioController()
        var nowPlayingPost: Int = 0 
    
        private init(){}
    
        func playAudioFrom(url: URL){
            // your implementation 
        } 
        // Other methods, stop, pause, etc.
    }
    

    视图控制器中的任何位置:

    AudioController.sharedInstance.playAudio(url: url)
    

    【讨论】:

    • 我有一个关于这个的问题......我是否在这个 Singleton 类中定义我的 AVAudioPlayer?
    • 是的,类中的任何变量或方法都可以通过共享实例访问。类单例也是线程安全的,这意味着它们不会阻塞主线程来执行任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多