代码之家  ›  专栏  ›  技术社区  ›  user979331

Swift 3 AVFoundation停止以前的AVAudioPlayer

  •  0
  • user979331  · 技术社区  · 6 年前

    这是我的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或其他什么?最好的做法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   RLoniello    6 年前

    我认为最好的解决方案是使用类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)