如何延迟迭代

时间:2015-05-19 17:49:09

标签: swift loops for-loop grand-central-dispatch

我正在制作一个莫尔斯代码应用程序,我想一个接一个地播放声音,但我似乎无法让它工作。他们都在同一时间玩,所以我只能在这里玩最后一个。这是我到目前为止所做的。

这是我的延迟功能。

func delay(delay:Double, closure:()->()) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(delay * Double(NSEC_PER_SEC))),dispatch_get_main_queue(), closure)
}

这是我的迭代循环

for i in morseArray
    {
        println("delayTime: \(delayTime)")
        if i == "."
        {
            delay(delayTime++, closure: { () -> () in
                self.dotSound.play()
            })
        }
        else if i == "-"
        {
            delay(delayTime++, closure: { () -> () in
                self.dashSound.play()
            })
        }
    }

1 个答案:

答案 0 :(得分:2)

这在一个简单的for循环中永远不会起作用,因为每个play命令都需要时间(这是非常耗时的异步)。因此,你不能也不能“等待”声音完成。正如您所发现的,您日益增加的延迟并不是一个可行的解决方案。你将需要一个更复杂的策略来排列你的点和短划线声音,以便一切按顺序发生。

一种非常简单的方法是使用AVQueuePlayer,它可以实现这一点:它可以让你排列一系列声音文件来播放,然后连续播放它们。

我在“99瓶”应用程序中使用的更复杂的解决方案将涉及利用AVAudioPlayer完成时发出的委托消息。您可以通过播放下一个声音来响应每个“我已完成”的消息,而不是循环。所以,你要将声音列表保存在一个数组中,每个“我已经完成”的委托方法会将第一个声音从数组前面拉出并播放。