2015-11-06 54 views
1

我有这样的代码,我想基本上是:更改按钮图像进行了一定的时间,然后重新设置,然后换另一个按钮等等反正有没有把它变成for循环或改进它?

buttonList[total[0]].setImage(imagePlay, forState: .Normal); 
     let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
     dispatch_after(time, dispatch_get_main_queue()) { 
      self.buttonList[total[0]].setImage(self.og, forState: .Normal); 
      self.buttonList[total[1]].setImage(self.imagePlay, forState: .Normal); 
      let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
      dispatch_after(time, dispatch_get_main_queue()) { 
       self.buttonList[total[1]].setImage(self.og, forState: .Normal); 
       self.buttonList[total[2]].setImage(self.imagePlay, forState: .Normal); 
       let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
       dispatch_after(time, dispatch_get_main_queue()) { 
        self.buttonList[total[2]].setImage(self.og, forState: .Normal); 
        self.buttonList[total[3]].setImage(self.imagePlay, forState: .Normal); 
        let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
        dispatch_after(time, dispatch_get_main_queue()) { 
         self.buttonList[total[3]].setImage(self.og, forState: .Normal); 
         self.buttonList[total[4]].setImage(self.imagePlay, forState: .Normal); 
         let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
         dispatch_after(time, dispatch_get_main_queue()) { 
          self.buttonList[total[4]].setImage(self.og, forState: .Normal); 
          self.buttonList[total[5]].setImage(self.imagePlay, forState: .Normal); 
          let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
          dispatch_after(time, dispatch_get_main_queue()) { 
           self.buttonList[total[5]].setImage(self.og, forState: .Normal); 
           self.buttonList[total[6]].setImage(self.imagePlay, forState: .Normal); 
           let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
           dispatch_after(time, dispatch_get_main_queue()) { 
            self.buttonList[total[6]].setImage(self.og, forState: .Normal); 
            self.buttonList[total[7]].setImage(self.imagePlay, forState: .Normal); 
            let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
            dispatch_after(time, dispatch_get_main_queue()) { 
              self.buttonList[total[7]].setImage(self.og, forState: .Normal); 
              self.buttonList[total[8]].setImage(self.imagePlay, forState: .Normal); 
              let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
              dispatch_after(time, dispatch_get_main_queue()) { 
               self.buttonList[total[8]].setImage(self.og, forState: .Normal); 
               self.replayButton.enabled = true; 
               for(var i = 0; i < self.buttonList.count; i++){ 
                self.buttonList[i].enabled = true; 

正如你可以看到这是一个长期的过程最终我会有30 +的大小的数组,有人可以建议一个更好的方式吗?谢谢。

回答

1

你可以使用一个功能,只是时间表一切提前,这样的:

func updateButtonImages() { 
    let buttons = total.map { buttonList[$0] } 
    buttons[0].setImage(imagePlay, forState: .Normal) 

    var time = dispatch_time(DISPATCH_TIME_NOW, 0) 
    for (priorButton, currentButton) in zip(buttons[0..<buttons.count - 1], buttons[1..<buttons.count]) { 
     time = dispatch_time(time, Int64(speed * Double(NSEC_PER_SEC))) 
     dispatch_after(time, dispatch_get_main_queue()) { 
      priorButton.setImage(og, forState: .Normal) 
      currentButton.setImage(imagePlay, forState: .Normal) 
     } 
    } 

    time = dispatch_time(time, Int64(speed * Double(NSEC_PER_SEC))) 
    dispatch_after(time, dispatch_get_main_queue()) { 
     buttons.last?.setImage(og, forState: .Normal) 
     replayButton.enabled = true 
     buttonList.forEach { $0.enabled = true } 
    } 
} 

或者你可以使用一个功能重新安排本身,就像这样:

func updateButtonImages(currentIndex currentIndex: Int = 0, priorIndex: Int? = nil) { 
    if let priorIndex = priorIndex { 
     buttonList[total[priorIndex]].setImage(og, forState: .Normal) 
    } 

    if currentIndex == total.count { 
     replayButton.enabled = true 
     buttonList.forEach { 
      $0.enabled = true 
     } 
     return 
    } 

    buttonList[total[currentIndex]].setImage(imagePlay, forState: .Normal) 

    let nextUpdateTime = dispatch_time(DISPATCH_TIME_NOW, Int64(speed * Double(NSEC_PER_SEC))) 
    dispatch_after(nextUpdateTime, dispatch_get_main_queue()) { 
     updateButtonImages(currentIndex: currentIndex + 1, priorIndex: currentIndex) 
    } 
} 

无论哪种方式,只需拨打updateButtonImages()启动进程。

-1

是的,你可以使用递归函数。它可以帮助你很好。

1

除非我误解你的代码,递归可能有助于

buttonList[total[0]].setImage(imagePlay, forState: .Normal); 
delayedImageChangeForIndex(0) 

然后

func delayedImageChangeForIndex(index: Int) { 
    let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), Int64(speed * Double(NSEC_PER_SEC))) 
    dispatch_after(time, dispatch_get_main_queue()) { 
     self.buttonList[total[index]].setImage(self.og, forState: .Normal); 
     self.buttonList[total[index + 1]].setImage(self.imagePlay, forState: .Normal); 

     index++ 
     if (index == 30) { 
      // when reached max index, break the recursion 
      return 
     }   

     //recursion here 
     delayedImageChangeForIndex(index) 
    } 
} 

不知道从哪里total阵列从何而来。如果它是一个类属性,使用self,否则你需要将它发送的参数delayedImageChangeForIndex