【问题标题】:How to implement AVAudioPlayer Inside Singleton Method?如何在 Singleton 方法中实现 AVAudioPlayer?
【发布时间】:2015-12-23 12:08:44
【问题描述】:

这是我的代码:

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 下但是我不能实现它。

在输入 let audioPlayer:AVAudio -> 时没有显示任何内容。

【问题讨论】:

    标签: ios swift singleton swift2 avaudioplayer


    【解决方案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中的try-catch就是do-try-catch。其他一些语法错误也已修复。

    在 Swift BTW 中不以这种方式使用单例。

    用法:

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

    【讨论】:

    • 如何在其他类中访问此方法,请添加到,对我有帮助
    • 编辑添加使用示例。第一行使用新实例,第二行使用共享实例。
    • 请注意,音频播放器可能会在创建后立即被释放,但没有任何反应。你应该在课堂上的某个地方分配它。
    • 2015-12-23 19:07:48.980 Ss[2549:153426] 19:07:48.980 警告:40:错误:无法获取默认输入设备,ID = 0,错误 = 0 ! 2015-12-23 19:07:48.981 S[2549:153426] 19:07:48.981 警告:40:错误:无法获取默认输出设备,ID = 0,错误 = 0! 2015-12-23 19:07:48.981 S[2549:153426] 19:07:48.981 错误:708:查找有效输入或输出设备时出错! 2015-12-23 19:07:48.982 S[2549:153426] 19:07:48.982 错误:312:错误 -66680
    • 为我工作。我什至在我的设备上播放了一首歌曲。也许您正在使用模拟器并且不支持播放器?或者应用程序的其他部分可能会产生此错误。
    【解决方案2】:

    至于你的情况下的单例部分(来自 cmets)你应该可能使用这样的东西:

    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")
    

    【讨论】:

    • 非常感谢@Matic Oblak,祝你圣诞快乐 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多