Giới thiệu
Bài viết này hướng dẫn sử dụng Timer để thực thi một tác vụ lặp lại theo chu kỳ đều đẳng (ví dụ: cập nhật UI mỗi giây).
Các bước thực hiện
Bước 1: Tạo dự án
Xcode → New Project → Single View Application → Tên "Timer".
Bước 2: Thiết kế giao diện
Thêm 1 Label lên Main.storyboard để hiển thị thời gian.

Bước 3: Kết nối IBOutlet
@IBOutlet weak var timerLabel: UILabel!
Bước 4: Khai báo biến
var timeLaunched: Int = 0 var timer: Timer?
Bước 5: Hàm cập nhật Label
@objc func updateLabel() {
timerLabel.text = "Thời gian chạy: \(timeLaunched) giây"
timeLaunched += 1
}
Bước 6: Khởi tạo Timer trong viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
updateLabel() // Cập nhật ngay lập tức
// Tạo timer lặp lại mỗi 1 giây
timer = Timer.scheduledTimer(timeInterval: 1.0,
target: self,
selector: #selector(updateLabel),
userInfo: nil,
repeats: true)
}
Bước 7: Chạy thử
Label cập nhật số giây mỗi giây một lần:

Quản lý vòng đời Timer
Hủy timer khi không cần nữa (quan trọng!)
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
timer?.invalidate() // Dừng timer
timer = nil
}
Cách hiện đại: Timer với Closure (iOS 10+)
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
guard let self = self else { return }
self.timeLaunched += 1
self.timerLabel.text = "Thời gian: \(self.timeLaunched)s"
}
Các loại Timer khác
| Loại | Mô tả |
|---|---|
Timer.scheduledTimer(...) | Tự động thêm vào RunLoop hiện tại, chạy ngay. |
Timer(timeInterval:...) + RunLoop.main.add(timer, forMode: .common) | Tạo timer thủ công, kiểm soát RunLoop mode (ví dụ: chạy khi scroll). |
DispatchSourceTimer | Cấp thấp hơn, chính xác hơn, dùng cho background task. |
Lưu ý quan trọng
- Timer giữ strong reference đến
target→ dễ gây **retain cycle** nếu không invalidate. - Luôn dùng
[weak self]trong closure-based timer. - Timer không chính xác tuyệt đối (độ trễ vài ms) - không dùng cho real-time audio/video.
- Trên background thread, timer chỉ chạy nếu RunLoop của thread đó đang chạy.