2015-12-23 2 views
2

Это мой код:Как реализовать AVAudioPlayer внутри Singleton Method?

class SomeAudioManager: NSObject 
{ 

    class var sharedInstance: SomeAudioManager{ 
     struct Static { 
      static var onceToken: dispatch_once_t = 0 
      static var instance: SomeAudioManager? = nil 
     } 
     dispatch_once(&Static.onceToken) { 
      Static.instance = SomeAudioManager() 
     } 
     return Static.instance! 
    } 
    func audioView(songname: NSString,format: NSString) 
    { 
     let audioPlayer:ava 
     audioPlayer=try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(songname, ofType:format)!), fileTypeHint: AVFileTypeMPEGLayer3) 
     audioPlayer!.delegate=self; 
     self.audioPlayer!.play() 
    } 
} 

Это AVAudioPlayer под NSObject, но я не могу его реализовать.

Во время ввода текста audioPlayer: AVAudio -> ничего не отображалось.

ответ

1

Не то, что он делает много смысла, но это составляет для меня:

import AVFoundation 
class SomeAudioManager: NSObject, AVAudioPlayerDelegate 
{ 
    class var sharedInstance: SomeAudioManager { 
     struct Static { 
      static var onceToken: dispatch_once_t = 0 
      static var instance: SomeAudioManager? = nil 
     } 
     dispatch_once(&Static.onceToken) { 
      Static.instance = SomeAudioManager() 
     } 
     return Static.instance! 
    } 
    func audioView(songname: String,format: String) { 
     let audioPlayer: AVAudioPlayer 

     do { 
      audioPlayer = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(songname, ofType:format)!), fileTypeHint: AVFileTypeMPEGLayer3) 
      audioPlayer.delegate = self; 
      audioPlayer.play() 
     } catch { 
      // error 
     } 
    } 
} 

Так что вам нужно импортировать базу, примерка улов в стриже это делать-примерочный улов. Также исправлен и другой синтаксис.

Синглтон не используется таким образом в Swift BTW.

Использование:

class someOtherClass { 
    func doSomething() { 
     SomeAudioManager().audioView("name_here", format: "format_here") 
     SomeAudioManager.sharedInstance.audioView("name_here", format: "format_here") 
    } 
} 
+0

Как получить доступ к этому методу в другом классе, пожалуйста, добавьте это, это поможет мне –

+0

Отредактировано для добавления примера использования. Первая строка использует новый экземпляр, а второй использует общий экземпляр. –

+0

Обратите внимание, что аудиоплеер, вероятно, получает освобождение сразу после его создания, но ничего не происходит. Вы должны назначить его где-нибудь в классе. –

2

Что касается одноплодной части в вас случае (с комментариями), вы должны вероятно, использовать что-то вроде этого:

class MyAudioPlayer: NSObject, AVAudioPlayerDelegate { 
    private static let sharedPlayer: MyAudioPlayer = { 
     return MyAudioPlayer() 
    }() 

    private var container = [String : AVAudioPlayer]() 

    static func playFile(name: String, type: String) { 
     var player: AVAudioPlayer? 
     let key = name+type 
     for (file, thePlayer) in sharedPlayer.container { 
      if file == key { 
       player = thePlayer 
       break 
      } 
     } 
     if player == nil, let resource = NSBundle.mainBundle().pathForResource(name, ofType:type) { 
      do { 
       player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: resource), fileTypeHint: AVFileTypeMPEGLayer3) 
      } catch { 
       // error 
      } 
     } 
     if let thePlayer = player { 
      if thePlayer.playing { 
       // already playing 
      } else { 
       thePlayer.delegate = sharedPlayer 
       sharedPlayer.container[key] = thePlayer 
       thePlayer.play() 
      } 
     } 
    } 
} 

И использование является:

MyAudioPlayer.playFile("Breach", type: "mp3") 
+0

большое вам спасибо @Matic Oblak, и вперед веселое рождество :) –