Sử dụng NSTimer trong swift
This post hasn't been updated for 3 years
Chào các bạn, trong bài viết này chúng ta sẽ cùng nha tìm hiểu về NSTimer trong Swift bằng cách xây dựng một ứng dụng đếm số nhị phân (Binary Counter)
Đầu tiên chúng ta sẽ xem qua 1 chút về các thành phần sẽ sử dụng trong project:
NSTimer
Về cơ bản thì một timer sẽ thực thi vài dòng lệnh sau một khoảng thời gian nhất định do chúng ta quy định. Một đối tượng timer sẽ chờ 1 khoảng thời gian được xác định trước. Cho tới thời điểm đó, nó sẽ bắn một message tới target object mà nó liên kết (associated).
Để có thể thực sự hiểu về các timer thì bạn nên tìm hiểu thêm 1 chút về NSRunLoop
NSRunLoop
Mỗi ứng dụng iOS sẽ tạo ra ít nhất một đối tượng NSThread (Main Thread) đảm nhiệm vai trò thực thi các dòng lệnh của ứng dụng. Mỗi đối tượng NSThread
có một liên kết với NSRunLoop để quản lý các đầu vào như là chuột, bàn phím, touches, connections và cả timers (đoạn này là kiến thức chung cho cả OSX)
NSRunLoop
liên tục thực hiện các vòng lặp cho việc kiểm tra các các "input events". Một trong các sự kiện (events) nó kiểm tra chính là timer interval elapsed event. Khi mà một vòng chạy phát hiện sự kiện này, nó sẽ thực hiện method được gắn với timer.
Timer không làm việc là real-time. Lý do là NSRunLoop có thể dành nhiều thời gian hơn timer interval ở các mode khác nên sự kiện timer có thể sẽ bị delay.
Bộ đếm nhị phân
Sau khi có một số kiến thức cơ bản, chúng ta sẽ bắt tay vào xây dựng ứng dụng
Bước 1: Khởi tạo Project
Hãy taọ một ứng dụng mới với Single View Application với ngôn ngữ là Swift:
Bước 2: Khởi tạo UI
Mở Main.storyboard
Kéo một đối tượng UILabel
và hai đối tượng UIButton
vào và đặt tên Start cho button thứ nhất và Reset cho button thứ hai
Bước 3: Tạo các outlets và actions
Bước 4: Thêm đối tượng NSTimer
Bên dưới IBOutlet
của label, tạo thêm 2 biến timer và binaryCount
Ở Swift, số có thể được biểu diễn bởi nhiều định dạng bằng cách thêm các tiền tố khác nhau, ví dụ: 0b
cho binary, 0o
cho octal và 0x
cho hexadecimal. Ví dụ 0b0011
biểu diễn cho số 3 nhị phân.
Bây giờ chúng ta sẽ tạo ra một đối tượng NSTimer
gọi đến function countUp
sau mỗi 1s
Tiếp theo chúng ta sẽ viết function countUp()
và helper function để update label
Cuối cùng, chúng ta sẽ viết function khi chạm vào nút Reset
Để stop timer, chúng ta phải gọi method invalidate()
. Sau khi method này được thực thi, timer sẽ trở thành "invalid" và không có cách nào để start lại. Nếu bạn muốn start, chúng ta phải tạo 1 instance mới của NSTimer như trong startButtonAction
Như vậy bạn đã tạo xong 1 ứng dụng nhỏ thực hiện cho việc demo về NSTimer, hi vọng các bạn sẽ hiểu hơn về NSTimer cũng như NSRunLoop qua ví dụ nhỏ này. Phần code của bài này khá đơn giản và mình đã up ảnh đầy đủ. Mục đích muốn các bạn tự gõ lại vì chỉ khi tự tay gõ lại các bạn sẽ hiểu hơn và nhớ hơn là việc copy và paste
All Rights Reserved