2016-03-24 6 views
3

Das Abspielen eines Sounds ist im Code so ausführlich und würde nach Möglichkeit eine Erweiterung von AVAudioSession erstellen. Die Art, wie ich es mache, ist das Zuweisen eines Objekts zu einer Variablen, aber ich benötige Hilfe/Ratschläge, wie diese Funktion eingerichtet wird, damit sie wiederverwendet und optimiert wird.Wiederverwendbare Erweiterung zum Abspielen von Sound ohne Speicherverlust in iOS und Swift?

Hier ist, was ich habe:

func playSound(name: String, extension: String = "mp3") { 
    let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension) 

    do { 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
     try AVAudioSession.sharedInstance().setActive(true) 

     UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 

     audioPlayer = try AVAudioPlayer(contentsOfURL: sound!) 
     audioPlayer?.prepareToPlay() 
     audioPlayer?.play() 
    } catch { } 
} 

Ich glaube, ich habe die audioPlayer Variable außerhalb dieser Funktion zu schaffen, sonst hatte ich eine harte Zeit, etwas zu spielen. Vielleicht kann es in sich abgeschlossen sein? Ich hoffe, dass es so etwas zu verwenden:

AVAudioSession.sharedInstance().play("bebop") 

Antwort

3

den Code gerade Einnahme von Ihr Beispiel Ich sehe zwei Optionen:

1) Gibt es einen bestimmten Grund, warum Sie es als eine Erweiterung von AVAudioSession machen wollen? Wenn nicht, machen Sie einfach Ihren eigenen Service!

class AudioPlayerService { 

    static let sharedInstance = AudioPlayerService() 

    var audioPlayer: AVAudioPlayer? 

    func playSound(name: String, extension: String = "mp3") { 
     let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension) 

     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      try AVAudioSession.sharedInstance().setActive(true) 

      UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 

      audioPlayer = try AVAudioPlayer(contentsOfURL: sound!) 
      audioPlayer?.prepareToPlay() 
      audioPlayer?.play() 
     } catch { } 
    } 

} 

2) Wenn Sie Notwendigkeit tun , um es als eine Erweiterung der AVAudioSession zu machen, dann nehmen Sie einen Blick auf associated objects

extension AVAudioSession { 

    private struct AssociatedKeys { 
     static var AudioPlayerTag = "AudioPlayerTag" 
    } 

    var audioPlayer: AVAudioPlayer? { 
     get { 
      return objc_getAssociatedObject(self, &AssociatedKeys.AudioPlayerTag) as? AVAudioPlayer 
     } 

     set { 
      if let newValue = newValue { 
       objc_setAssociatedObject(
        self, 
        &AssociatedKeys.AudioPlayerTag, 
        newValue as AVAudioPlayer?, 
        .OBJC_ASSOCIATION_RETAIN_NONATOMIC 
       ) 
      } 
     } 
    } 

    func playSound(name: String, extension: String = "mp3") { 
     let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension) 

     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      try AVAudioSession.sharedInstance().setActive(true) 

      UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 

      audioPlayer = try AVAudioPlayer(contentsOfURL: sound!) 
      audioPlayer?.prepareToPlay() 
      audioPlayer?.play() 
     } catch { } 
    } 

} 
1

Dies ist der beste Weg, die ich gefunden habe, um Ton hinzufügen

Dateiname ist shootMissile.wav

func shootMissileSound() { 
    if let soundURL = NSBundle.mainBundle().URLForResource("shootMissile", withExtension: "wav") { 
     var mySound: SystemSoundID = 0 
     AudioServicesCreateSystemSoundID(soundURL, &mySound) 
     AudioServicesPlaySystemSound(mySound); 
    } 
} 
Verwandte Themen