无法迅速使计时器无效

0 timer ios swift

在我的应用程序中,我应该使用多个计时器,但我不想为每个函数添加单独的计时器,如何创建一个简化创建多个计时器的函数,我在下面尝试了此代码,它可以工作,但我无法使计时器无效。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var first: UILabel!

@IBOutlet weak var second: UILabel!

  var count = 0
  var count2 = 0

  var timer = Timer()
  var timer2 = Timer()

 override func viewDidLoad() {
    super.viewDidLoad()

    timerWithDifferentIntervals(myTimer: timer, interval: 1, target: self, selector: #selector(handle1), userInfo: nil, repeats: true)

    timerWithDifferentIntervals(myTimer: timer2, interval: 1/6, target: self, selector: #selector(handle2), userInfo: nil, repeats: true)
}

func handle1() {
    count += 1
    first.text = "\(count)"
}

func handle2() {
    count2 += 1
    second.text = "\(count2)"
}


func timerWithDifferentIntervals(myTimer: Timer, interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool) {
    var timers = myTimer
    timers = Timer.scheduledTimer(timeInterval: interval, target: target, selector: selector, userInfo: userInfo, repeats: repeats)
}


@IBAction func stop(_ sender: UIButton) {
    timer.invalidate()
    timer2.invalidate()
}

}
Run Code Online (Sandbox Code Playgroud)

Sul*_*han 7

您实际上从未为变量分配新值。您创建的计时器不会保存在任何地方,因此您无法使它们无效。

我建议进行以下更改:

var timer: Timer? {
   didSet {
      oldValue?.invalidate()
   }
}
var timer2: Timer? {
   didSet {
      oldValue?.invalidate()
   }
}
Run Code Online (Sandbox Code Playgroud)

这将确保在分配新计时器时,前一个计时器始终无效。然后,您可以使用timer = nil或使无效timer2 = nil

此外,您应该从您的方法中返回计时器:

func timerWithDifferentIntervals(interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool) -> Timer {
  return Timer.scheduledTimer(timeInterval: interval, target: target, selector: selector, userInfo: userInfo, repeats: repeats)
}
Run Code Online (Sandbox Code Playgroud)

并按以下方式使用它:

timer = timerWithDifferentIntervals(interval: 1, target: self, selector: #selector(handle1), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)

虽然这个方法现在基本上什么都不做,所以没有必要