定时器中的Swift 3定时器

时间:2017-05-05 08:52:18

标签: swift timer

计时器中的计时器如何工作?

func startSequenz()
{
    for mainCell in mainTable {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector:#selector(ViewController.run), userInfo: nil, repeats: true)
    }
}

func run ()
{
    for cell in table{
        timer2 = Timer.scheduledTimer(timeInterval: 1, target: self, selector:#selector(ViewController.run2), userInfo: nil, repeats: true)
    }
    timer!.invalidate()
}

func run2()
{
    currentSteps! += 1
    print("\(currentSteps!)")
    timer2!.invalidate()
}

执行func run2()永不停止。我的目标是延迟执行run2和sleep(1) freez GUI。

更新:

我已经使用了Tom E的答案而且部分工作了。但GUI在执行结束时只刷新一次。

func run ()
{
    for cell in table{

        DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(2)) {
        // This code will be placed on a background queue and be executed a second later

            // i do my stuff   

            DispatchQueue.main.async {

                // Here you may update any GUI elements  
                self.currentCell = cell
                self.currentStep! += 1

                self.sectionHeaderText = "\(self.currentStep!) of \(self.totalSteps!)"
                self.tableView.reloadSections(IndexSet(integer: 0), with: .none)
            }
        }
    }
}

public override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    switch section {
      case 0  : return sectionHeaderText
      default : return nil
    }
}

1 个答案:

答案 0 :(得分:1)

创建一个重复计时器似乎没有多大意义,它会在第一次调用其action方法时立即失效。

如果您寻求延迟执行代码的正确方法,请查看Grand Central Dispatch。以下是具有非阻塞,延迟后台执行的代码示例:

Fragment

请确保您不从后台队列访问任何GUI元素。因此,该示例显示了如何切换到主线程以进行任何GUI更新。