2009-11-05 6 views
6

Tôi muốn hiển thị thời gian (bao gồm giây) trong một ứng dụng trong một trường văn bản, khá đơn giản. Những gì tôi hiện đang làm là tạo một NSTimer chạy mỗi 0,1 giây để có thời gian hệ thống và cập nhật trường văn bản. Điều này có vẻ như một cách khủng khiếp không hiệu quả để thực hiện điều này. Có cách nào tốt hơn?Làm thế nào để hiển thị thời gian tính bằng giây trong Cocoa hiệu quả?

Trả lời

6

Bạn có đang hiển thị nó ở độ phân giải thứ mười một giây (hay nhỏ hơn) không?

Nếu vậy, tôi thấy không có vấn đề gì. Thông thường, bỏ phiếu hút vì những gì bạn đang kiểm tra có thể không thay đổi, nhưng nó không giống như thời gian sẽ dừng lại trên bạn. Vì vậy, một bộ đếm thời gian thứ mười của một giây là tốt.

Nếu không, hãy tạo bộ hẹn giờ có khoảng thời gian là độ phân giải mong muốn, sau đó nhận ngày giờ lửa, làm tròn độ phân giải mong muốn (ví dụ: toàn bộ giây nếu bạn cập nhật mỗi giây) và đặt ngày. Sau đó, bộ hẹn giờ của bạn sẽ chỉ phát ngẫu nhiên với thời gian thích hợp để cập nhật chế độ xem đồng hồ của bạn. Lưu ý rằng trong khi thời gian luôn di chuyển, nó không phải lúc nào cũng di chuyển tuyến tính: nó có thể nhảy trước hoặc lùi một giờ hoặc nửa giờ, hoặc bất kỳ số tiền nào nếu người dùng (hoặc ntpd) thay đổi cài đặt đồng hồ hệ thống. Trên Mac OS X 10.6 trở lên, bạn có thể quan sát NSSystemClockDidChangeNotification và điều chỉnh lại ngày lửa của bộ hẹn giờ khi điều đó xảy ra.

+0

Tôi chỉ hiển thị ở độ phân giải một giây. Nhưng nếu tôi thăm dò ý kiến ​​trong một giây, tôi có thể, ví dụ, .9 giây cuối ngày cập nhật văn bản của tôi. Nếu người dùng có tùy chọn "giây hiển thị" được đặt trên đồng hồ của họ trên thanh trình đơn, tôi muốn ứng dụng xuất hiện để cập nhật văn bản thời gian vào thời điểm chính xác thanh trình đơn thay đổi giây, do đó bỏ phiếu 10 lần mỗi giây. – rscott

+0

Bạn sẽ không bị trễ 0,9 giây nếu bạn đã đặt đúng ngày phát lửa. Bộ đếm thời gian sẽ phải tụt hậu khá khó để kéo nó ra - và nếu nó bị trễ 0,9 giây, thiết lập khoảng thời gian của nó là 0,1 giây sẽ không giúp được gì. –

0

Tôi không chắc điều gì khác sẽ hiệu quả hơn. Miễn là gọi lại cho bộ đếm thời gian của bạn không làm bất cứ điều gì quá chuyên sâu, bạn có thể gần tối ưu.

-2

Làm thế nào để sử dụng gettimeofday(2)? Nó trả về nhiều thông tin thời gian chính xác để sử dụng.

+1

Điều đó không giữ cho màn hình được cập nhật, mặc dù. Bắt thời gian hiện tại không phải là phần khó; đó là việc cập nhật định kỳ mà người hỏi đang thắc mắc. Ngoài ra, yêu cầu của bạn rằng 'gettimeofday'“ trả về nhiều thông tin thời gian chính xác hơn ”thiếu so sánh: Chính xác hơn cái gì? –

2

Làm thế nào về bạn sử dụng NSTimer chạy mỗi giây và sau đó bạn kiểm tra thời gian bắn và chắc chắn rằng nó là chính xác vào đầu một giây. Bạn có thể sử dụng initWithFireDate:interval:target:selector:userInfo:repeats: hoặc đặt thời gian gọi tiếp theo một cách thích hợp sử dụng setFireDate: sau khi bộ đếm thời gian đã được tạo ra:

NSTimeInterval interval = [[timer fireDate] timeIntervalSinceReferenceDate]; 
NSTimeInterval nextFire = ceil(interval); 
[timer setFireDate: [NSDate dateWithTimeIntervalSinceReferenceDate: nextFire]; 

Sau đó, bạn sẽ chắc chắn rằng các đám cháy timer càng gần với thời gian cần thiết càng tốt và đừng lo lắng về bộ hẹn giờ tụt lại phía sau vì nó tự đặt lại sau mỗi lần bắn sử dụng ngày dự định và khoảng thời gian bạn đã cung cấp, vì vậy nó sẽ luôn cố gắng kích hoạt chính xác thứ hai (nhưng sẽ kích hoạt bất cứ khi nào vòng lặp chạy có thể thực hiện điều đó).