AVAudioPlayer 可以按预定义的时间间隔触发事件吗?

can AVAudioPlayer trigger events on predefined intervals?

我需要在固定时间显示视图,同时 运行 播放 MP3 音频。我正在使用 Swift。有什么建议吗?

使用 NSTimer 或 AVAudioPlayer 的 addPeriodicTimeObserverForInterval:queue:usingBlock: 方法检查该值,当达到特定时间时(很可能)无法获得更新。

哦,对于 Swiftier NSTimer,我建议 this

如果绘图依赖计时器,我不喜欢使用它们。它们可能比屏幕重绘更频繁地触发或与屏幕绘图不同步。我改为使用 CADisplayLink。它类似于计时器,但设计为与屏幕的刷新率同步。你可以实现这样的东西。

var messagePlaybackTimer: CADisplayLink?
var player: AVAudioPlayer?

func playAudioData(){
    let path = NSBundle.mainBundle().pathForResource("audio", ofType: "mp3")
    var url: NSURL

    if let audioResourcePath = path {
        url = NSURL.fileURLWithPath(audioResourcePath)!
    }else{
        return;
    }

    player = AVAudioPlayer(contentsOfURL: url, error: nil)

    messagePlaybackTimer?.invalidate()
    messagePlaybackTimer = nil;

    messagePlaybackTimer = CADisplayLink(target: self, selector: Selector("messagePlaybackTimerFired"))

    messagePlaybackTimer?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)

    player?.play()
}

func messagePlaybackTimerFired(){
    println(player?.currentTime)
}

在 messagePlaybackTimerFired() 中,您可以检查 AVAudioPlayer 的当前时间并根据它触发事件。 (例如 if player?.currentTime > 5 && player?.currentTime < 6 { do something } )

这将使您能够在尽可能接近 5 秒的时间内触发该方法,同时仍然是执行 UI 工作的最佳选择。

当您使用完 CADisplayLink 后(当播放器停止播放时)一定要使其无效。如果你不这样做,它会在你不再需要它时继续发射。

您可以做的另一件事是在 messagePlaybackTimerFired() 中触发 NSNotification,您的 UIViewController 可以订阅通知并在适当的时候显示视图。