Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> iOS

Cách lặp lại tác vụ theo khoảng thời gian đều đặn (Timer) trên iOS Swift

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.

Cách lặp lại tác vụ theo khoảng thời gian đều đặn (Timer) trên iOS Swift

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:

Cách lặp lại tác vụ theo khoảng thời gian đều đặn (Timer) trên iOS Swift

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ạiMô 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).
DispatchSourceTimerCấ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.