呼叫之间的调度和延迟

时间:2014-12-01 21:53:35

标签: ios swift grand-central-dispatch

我正在制作一个老游戏Simon(a.k.a.Genius,在巴西)的克隆,一个带有彩色按钮的玩家需要按照一系列颜色按下。

测试时,界面有4个彩色按钮 我为按钮插座创建了一个数组,以便于访问:

var buttonArray:[UIButton] = [self.greenButton, self.yellowButton, self.redButton, self.blueButton]

另外,创建另一个数组来存储颜色序列

var colors:[Int] = []

当游戏开始时,它会调用一个函数,该函数会添加0到3之间的随机数(buttonArray上的索引),并将此数字添加到colors数组中 在添加颜色序列的新颜色后,应用程序需要显示用户的序列,因此他可以重复它

为此,它调用了playMoves函数,该函数使用for循环运行colors数组并从按钮更改alpha,模拟'blink'

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_after,传递0.5秒并在代码块上返回alpha,你们可以看到在上面的代码上。

在第一次运行时,它似乎正确地执行了,但是当colors数组有2个或更多项时,当它运行循环时,虽然它有0.5秒的延迟,但它同时闪烁所有按钮。

这可能是我正在做的一些愚蠢的错误,但我现在一无所知。

我非常感谢所有的帮助!

谢谢!

1 个答案:

答案 0 :(得分:2)

所有这些dispatch_after次呼叫几乎同时被安排,使它们看起来同时闪烁。有几种方法可以解决这个问题:

例如,您可以调整每个按钮的when参数(dispatch_time_t参数)以偏离原始时间(delay实际上是{{1} }})。

您也可以使用关键帧动画,但我建议您先尝试在i * 0.5 * Double(NSEC_PER_SEC)方法中修复delay