2011-11-17 36 views
8

Tôi có một ứng dụng được cho là để ghi lại những thứ nhất định sau mỗi 1 giây và hiện tại tôi đang sử dụng NSTimer, nhưng nếu ứng dụng của tôi chuyển đổi màn hình (hoặc hầu như bất cứ điều gì khác, thực sự) nó làm chậm bộ đếm thời gian một chút làm cho các bài đọc không chính xác.NSTimer thay thế đáng tin cậy

Cách thay thế đáng tin cậy để sử dụng là gì? mã hiện tại của tôi là như sau:

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES]; 

Trả lời

12

NSTimer không được đảm bảo kích hoạt chính xác đúng giờ. Nhưng bạn có thể sử dụng NSTimer theo cách đáng tin cậy hơn nhiều so với hiện tại. Khi bạn sử dụng scheduledTimerWithTimeInterval, bạn tạo một NSTimer được lên lịch trong vòng lặp chạy cho NSDefaultRunLoopMode. Chế độ này bị tạm dừng khi giao diện người dùng đang được sử dụng, vì vậy bộ hẹn giờ của bạn sẽ không kích hoạt khi có tương tác của người dùng. Để tránh tạm dừng này, hãy sử dụng chế độ NSRunLoopCommonModes. Để thực hiện việc này, bạn sẽ phải lên lịch hẹn giờ như sau:

timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
+0

Được rồi, tôi sẽ thay đổi điều này ngay bây giờ. Tôi có làm mất hiệu lực bộ hẹn giờ giống như cách '[timer invalidate]'? – Baub

+0

Bộ hẹn giờ được tạo theo cách này tương tác giống nhau. Ngoại trừ việc bạn phải thêm nó theo cách thủ công. Khi bạn gọi invalidate nó sẽ được tự động loại bỏ khỏi runloop giống như trước đây. – NJones

4

Bạn có thể:

  • Đặt NSTimer trong một chủ đề khác nhau (nó có thể không bị ảnh hưởng bởi giao diện người dùng theo cách đó)
  • Giảm khoảng (nói 0,1 giây) và, trong chức năng ghi nhật ký của bạn, hãy kiểm tra xem đó là thời điểm "đúng" để ghi lại những gì bạn muốn.
+0

không NSTimer tạo chuỗi mới của riêng mình ...? chỉ cần hỏi ... tôi đã đọc ở đâu đó. –

+1

Tôi không biết, Steve Jobs. Bạn nói với tôi. ;) – Baub

+0

Tôi đã thử đặt bộ hẹn giờ trong một luồng khác bằng cách gọi 'performSelectorInBackground' nhưng nó sẽ không gọi bộ chọn khi nó được kích hoạt (tôi đoán vì nó nằm trong một luồng khác). – Baub

Các vấn đề liên quan