Я создал объект Timer для многократного выполнения некоторого кода каждую секунду в одном из контроллеров представления в моем приложении. Мой вопрос: будет ли система автоматически аннулировать таймер, когда я выталкиваю контроллер представления из стека навигации? Каким-то образом моя интуиция подсказывает мне, что это не так, потому что сам объект таймера не привязан напрямую к объекту контроллера представления.
Редактировать Примечание: Ниже приведен код для файла V C swift, в котором создается таймер. Пожалуйста, не bash меня из-за моего любительского кода. Таким образом, создается V C этого типа, который помещается в стек навигации. Предполагая сценарий, когда пользователь не нажимал кнопку паузы (в этом случае таймер становится недействительным) перед тем, как вернуться к виду root, нажав кнопку возврата на панели навигации, будет ли объект таймера уничтожен?
//
// TimerViewController.swift
// SwiftyTimer
//
// Created by Jiaming Zhou on 5/6/20.
// Copyright © 2020 Jiaming Zhou. All rights reserved.
//
import UIKit
class TimerViewController: UIViewController {
@IBOutlet var countDownLabel: UILabel!
@IBOutlet var imageView: UIImageView!
private var timer: Timer?
private var timePassed = -1
private enum status {
case ongoing
case paused
case completed
}
private enum buttonImage {
case cancelButton
case pauseButton
case resumeButton
}
private var state = status.ongoing
var activity: Activity?
override func viewDidLoad() {
super.viewDidLoad()
if let activity = activity {
imageView.image = UIImage(named: activity.name)
view.backgroundColor = UIColor(named: activity.color)
}
//Start a timer that increments every second
updateTimer()
creatTimer()
}
@IBAction func buttonsPressed(_ sender: UIButton) {
switch sender.tag {
case 0:
timePassed = -1
timer?.invalidate()
state = status.ongoing
creatTimer()
updateTimer()
case 1:
if state == status.ongoing {
timer?.invalidate()
timer = nil
state = status.paused
sender.setBackgroundImage(UIImage(named: "\(buttonImage.resumeButton)"), for: .normal)
sender.setTitle("Resume", for: .normal)
} else if state == status.paused {
creatTimer()
state = status.ongoing
sender.setBackgroundImage(UIImage(named: "\(buttonImage.pauseButton)"), for: .normal)
sender.setTitle("Pause", for: .normal)
}
default:
return
}
}
}
//MARK: - Timer
extension TimerViewController {
func creatTimer() {
let timer = Timer(timeInterval: 1, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: .common)
self.timer = timer
}
@objc func updateTimer() {
if let activity = activity {
timePassed += 1
if timePassed == activity.duration {
self.timer?.invalidate()
state = status.completed
let alert = UIAlertController(title: "Time's Up!", message: "you have completed your activity", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "dismiss", style: .cancel, handler: nil))
present(alert, animated: true)
}
let currentTime = activity.duration - timePassed
let hours = currentTime / 3600
let minutes = (currentTime / 60) % 60
let seconds = currentTime % 60
var countDown = ""
if hours > 0 {
countDown += "\(hours):"
}
if minutes > 9 {
countDown += "\(minutes):"
} else {
countDown += "0\(minutes):"
}
if seconds > 9 {
countDown += "\(seconds)"
} else {
countDown += "0\(seconds)"
}
countDownLabel.text = countDown
}
}
}