如何将[NSTimer]中的计时器设置为nil?

时间:2016-02-04 10:14:47

标签: ios swift nstimer

目标是在tableView中选择一行时触发计时器,同时摆脱旧的计时器。因为我不想留下任何内存,我想它们无效是不够的。新的计时器可能不同(我在这里简化了代码),所以我不想重复使用它们。

我尝试将数组中的计时器设置为nil,但是在timer = nil行上,Xcode会出错。

class DataModel() {
  var timers = [NSTimer]()
}

class TableViewController: UITableViewController {

  var dataModel = DataModel()

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    if dataModel.timers.count != 0 {
      for timer in dataModel.timers {
        timer.invalidate()
        timer = nil  //"Cannot assign to value: timer is a let constant."
      }
    }

    for i in 0...10 {
      var timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(i), target: self, selector: "doSomething", userInfo: nil, repeats: false)
      dataModel.timers.append(timer)
    }
  }    
}

我已尝试制作计时器实例选项NSTimer?,但这也不起作用,我可能在for timer in dataModels.timer行中做错了。我需要if let构造吗?

class DataModel() {
  var timers = [NSTimer?]()
}

class TableViewController: UITableViewController {

  var dataModel = DataModel()

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    if dataModel.timers.count != 0 {
      for timer in dataModel.timers {
        timer!.invalidate()
        timer = nil // Error here
      }
    }

    for i in 0...10 {
      var timer = NSTimer?()
      timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(i), target: self, selector: "doSomething", userInfo: nil, repeats: false)
      dataModel.timers.append(timer)
      //timer = nil // No error here.
    }
  } 
}

设置dataModel.timers = []肯定不够,我想,因为它只是清除数组但保留计时器实例。

解决这个问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

你基本上是无效并杀死所有的计时器,然后重新创建它们,所以只需用removeAll(keepCapacity:)清空2个循环之间的数组。

答案 1 :(得分:1)

你可以在数组中失效然后删除吗?你怎么在阵列中需要可选的定时器?

array.forEach{
  $0.invalidate()
}
array.removeAll()

答案 2 :(得分:0)

你不能在Swift中设置局部范围变量而不是nil,因为它不是var而是let

循环后只需nil个定时器变量。

答案 3 :(得分:0)

这是因为你处于一个循环中,你不能改变正在迭代的对象。

for timer in timers {
    // timer is initialized here like "let timer = timers[index]"
}

使循环中的计时器无效,然后设置

timers = nil

timers.removeAll()