2015-03-28 3 views
2

Im пытается перебрать массив, подсвечивая один цвет за раз, и после того, как закончил цикл через каждый элемент, вызвав другую функцию для запуска. До сих пор у меня есть это:loop through array with delay - Swift

//Delay function from http://stackoverflow.com/questions/24034544/dispatch-after-gcd-in-swift/24318861#24318861 
func delay(delay:Double, closure:()->()) { 
    dispatch_after(
     dispatch_time(
      DISPATCH_TIME_NOW, 
      Int64(delay * Double(NSEC_PER_SEC)) 
     ), 
     dispatch_get_main_queue(), closure) 
} 

@IBAction func computerTurn(){ 
    if(isFirstLevel){levelLabel.text = ("Level 1"); isFirstLevel = false} 
    else{ level++ } 

    var gameOrderCopy = gameOrder 
    var randomNumber = Int(arc4random_uniform(4)) 
    gameOrder.append(randomNumber) 
    var i = 0 

    for number in gameOrder{ 

     if number == 0{ 
      self.greenButton.highlighted = true 
      self.delay(1){ 
       self.greenButton.highlighted = false 
       } 
     } 

     else if number == 1{ 
      self.redButton.highlighted = true 
      self.delay(1){ 
       self.redButton.highlighted = false 
       } 

     } 

     else if number == 2{ 
      self.yellowButton.highlighted = true 
      self.delay(1){ 
       self.yellowButton.highlighted = false 
       } 
     } 
     else if number == 3{ 
     self.blueButton.highlighted = true 
     self.delay(1){ 
      self.blueButton.highlighted = false 
      } 
     } 
    } 
} 

Но на данный момент, все это делает задержку один второй, то освещая все цвета сразу. Мне нужно, чтобы загорелся цвет в последовательном порядке, со второй задержкой между ними. Заранее спасибо!

ответ

3

Не делайте задержку 1, положить var delayTime = 1 выше петли, и в цикле сделать self.delay(delayTime++)

+0

Спасибо! Я вижу, что делает этот код, но знаете ли вы, как я могу заставить их загораться один за другим, потому что теперь все снова загорается, но выходят с разными интервалами? – JohnnyCash

+0

Ах! Оберните подсветку = true и задержка. В зависимости от эффекта, который вы хотите, вам может понадобиться вторая переменная типа delayTime ... в зависимости от эффекта, который вы ищете. – Stripes

+0

СПАСИБО! Это заняло у меня столько времени, чтобы понять! Спасибо за помощь! – JohnnyCash

1

Вы можете попробовать один из двух вещей:

One: Вставка sleep(1) в начале вашей итерации gameOrder.

Два: Измените вашу delay функцию немного

func delay(delay:UInt32, closure:()->()) { 
     sleep(delay) 
     closure() 
    }