如果定位到iOS 10及更高版本,则可以使用的基于块的表示形式Timer
,从而简化了潜在的强参考周期,例如:
weak var timer: Timer?
func startTimer() {
timer?.invalidate() // just in case you had existing `Timer`, `invalidate` it before we lose our reference to it
timer = Timer.scheduledTimer(withTimeInterval: 60.0, repeats: true) { [weak self] _ in
// do something here
}
}
func stopTimer() {
timer?.invalidate()
}
// if appropriate, make sure to stop your timer in `deinit`
deinit {
stopTimer()
}
虽然Timer
通常最好,但是为了完整起见,我应该注意您也可以使用调度计时器,这对于在后台线程上调度计时器很有用。使用调度计时器,由于它们是基于块的,因此只要您使用引用,它就可以避免使用旧的target
/ selector
模式的强大的引用周期挑战。Timer
weak
所以:
var timer: DispatchSourceTimer?
func startTimer() {
let queue = DispatchQueue(label: "com.domain.app.timer") // you can also use `DispatchQueue.main`, if you want
timer = DispatchSource.makeTimerSource(queue: queue)
timer!.schedule(deadline: .now(), repeating: .seconds(60))
timer!.setEventHandler { [weak self] in
// do whatever you want here
}
timer!.resume()
}
func stopTimer() {
timer?.cancel()
timer = nil
}
deinit {
self.stopTimer()
}
有关更多信息,请参见《并发编程指南》中“ 派遣源”部分中“ 派遣源示例 ”的“ 创建计时器”部分。
对于Swift 2,请参阅此答案的先前版本。