Ios 呼叫之间的调度和延迟

Ios 呼叫之间的调度和延迟,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我正在为老游戏Simon(又名Genius,在巴西)制作一个克隆,这个游戏有彩色按钮,玩家需要按一系列颜色 对于测试,界面有4个彩色按钮 我为按钮插座创建了一个阵列,便于访问: var buttonArray:[UIButton] = [self.greenButton, self.yellowButton, self.redButton, self.blueButton] 此外,还创建了另一个数组来存储颜色序列 var colors:[Int] = [] 当游戏开始时,它会调用一个函数,将

我正在为老游戏Simon(又名Genius,在巴西)制作一个克隆,这个游戏有彩色按钮,玩家需要按一系列颜色

对于测试,界面有4个彩色按钮 我为按钮插座创建了一个阵列,便于访问:

var buttonArray:[UIButton] = [self.greenButton, self.yellowButton, self.redButton, self.blueButton]
此外,还创建了另一个数组来存储颜色序列

var colors:[Int] = []
当游戏开始时,它会调用一个函数,将一个从0到3的随机数(buttonArray上的索引)相加,并将这个数字添加到颜色数组中 在添加一个新的颜色序列后,应用程序需要为用户显示该序列,以便用户可以重复该序列

为此,它调用playMoves函数,该函数使用For循环遍历颜色数组,并从按钮更改alpha,模拟“闪烁”

func playMoves(){

    let delay = 0.5 * Double(NSEC_PER_SEC)
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

        for i in self.colors{

            self.buttonArray[i].alpha = 0.2

            dispatch_after(time, dispatch_get_main_queue(), {
                self.buttonArray[i].alpha = 1
            })                
        }    
}
它将alpha从按钮更改为0.2,然后在半秒钟后将alpha返回到1。我在之后使用dispatch_,经过0.5秒,在代码块上返回alpha,正如你们在上面的代码中看到的

在第一次运行时,它似乎做得很正确,但是当颜色数组有2个或更多项时,当它运行循环时,尽管它有0.5秒的延迟,但它会同时闪烁所有按钮

这可能是我犯的一些愚蠢的错误,但我现在不知所措

我将非常感谢所有的帮助


谢谢

所有这些
dispatch\u after
呼叫几乎都安排在同一时间,使它们在同一时间闪烁。有几种方法可以解决这个问题:

例如,您可以将每个按钮的
when
参数(
dispatch\u time\t
参数)调整为与原始时间偏移(这样
delay
实际上是
i*0.5*Double(NSEC\u/SEC)


您也可以使用关键帧动画,但我建议您先尝试在方法之后修复
调度中的
延迟

时间/延迟永远不会改变非常感谢您,Rob!你说到点子上了!它现在工作得很好!