2012-04-24 3 views
0

나는 ios에서 측정 시간과 관련하여 신뢰할 수있는 솔루션을 찾으려고합니다. 나는 1 초의 정밀도로 시간의 경과를 보여주고 싶다. ios에 내장 된 스톱워치와 정확히 같지만 초만 있습니다. NStimer 또는 약간의 사랑 수준 C의 도움으로 폴링을 사용하기 때문에 지금까지 발견 한 모든 해결책은보기 흉하게 보입니다. 내가 가진 문제는 "나는"언제나 시스템에 물어야한다는 것입니다. 그러나 NStimer에 의존해야만한다면 NStimer는 내 측정 값을 신뢰할 수 없습니다. 내 시간을 업데이트 할 시스템에서 호출 된 대리자 메서드가 있습니까? 만약 1ns로 폴링 해상도가 향상 되었다면 괜찮을 것입니다. 하지만 저레벨 C를 사용하여 어떻게 구현해야합니까?ios에서 실시간 시계 받기

+0

'NSTimer'는이 작업을 수행하는 전통적인 방법이며 1 초의 해상도에서 올바르게 작동합니다. 그것을 사용하지 않을 이유가 있습니까? 특정 문제를 시연하면 도움이됩니다. 또한 C 기반 솔루션을 찾고 있다면 질문에 다시 태그를 답니다. –

+0

그것은 이것을 구현하는 데 나에게 어떤 의미가 없습니다. 나는 그것의 추측을 관리하지만 두 번 생각하는 데는 잘못된 점이 없습니다. 실제 시간을 묻기 위해 NStimer를 1 초 해상도로 설정하면 실제로는 1 초 간격으로 오실 레이팅합니다. 때로는 0.9984 초 ... 1.0055 초 ...에 가끔 물어볼 것입니다. 나는 가장 가까운 1 초로 반올림해야 할 결과를 얻을 것입니다. 결과에 대한 결과는 => 매 초마다 다른 시간이 지속됩니다. 육체적으로 내 눈을 보지 못하겠습니까? 템포가 일정하지 않습니까? –

+0

당신의 뇌가 수십 밀리 초의 불일치를 얼마나 잘 구분하고 있다고 생각하십니까? 그다지 좋지는 않습니다. 나는'NSTimer'를 사용하여 그래픽 타이머를 구현했으며 잘 작동합니다. –

답변

1

나는 당신이 무엇을 목표로하는지 확신하지 못합니다. 고해상도 시간을 쿼리하는 좋은 방법이 필요한지 또는 시스템에서 다시 전화를 걸길 원하는지 파악할 수 없습니다.

전자는 이전 버전 인 경우 고해상도 타이머에 사용합니다.

#import "mach/mach_time.h" 

#define TICKS_TO_NANOS(_ticks_, _timebase_) (((_ticks_) * ((_timebase_).numer))/((_timebase_).denom)) 
#define NOW_IN_TICKS() (mach_absolute_time()) 
#define NOW_IN_NANOS(_timebase_) TICKS_TO_NANOS(NOW_IN_TICKS(), _timebase_) 

후자의 경우에, 당신 수 결코 보장 콜백 타이머를 얻을. 아마도 가장 일관된 타이머 콜백은 CADisplayLink에 연결하는 것이지만, 그래픽 메소드가 너무 오래 걸리면 일관되게 얻지 못할 수도 있습니다.

시스템 타이머를 사용해 볼 수도 있지만 그다지 보장 할 수는 없습니다.

1

iOS 기기는 초당 최대 60 번 디스플레이를 다시 그리기 만하므로 그 이상의 시간은 사용자가 볼 수 없습니다. CADisplayLink를 사용하여 매 프레임 시간, 초당 60 회 전화를 걸고 59 회의 통화를 무시할 수 있습니다. 그러나 표시 속도와 시계 사이의 드리프트를 확인하기 위해 시계 중 하나를 폴링해야합니다 (두 개 이상이 있습니다). 그리고 코드가 UI 실행 루프에서 너무 길어지면 프레임을 놓칠 수 있으므로이를 확인해야합니다.

관련 문제