2010-01-03 4 views
22

방금 ​​앱을 끝내고 베타 테스트가 스톱워치 부분의 버그를 발견했습니다 ... 스톱워치는 nstimer를 사용하여 계산을하고 랩을 저장하기위한 테이블을 가지고 있지만 랩 테이블이 스크롤되면 시계가 멈추거나 멈추고 잃어버린 시간을 만회하지 않습니다.runloop이 차단되었을 때 NSTimer가 실행되지 않음

는이를 이용하여 제거 하였다 실속 하였다

startingTime = [[NSDate date] timeIntervalSince1970]; 

은 경과 시간을 계산.

그러나 여전히 NSTimer를 사용하여 매 0.1 초를 트리거하고 있습니다. 즉, 경과 시간이 올바르게 업데이트 될지라도 스크롤이 여전히 멈추는 것을 의미합니다 ... 그리고 이것을 Apple 스톱워치와 비교합니다 그 초시계에는 경과 된 시간 계산을위한 별도의 스레드가 있는지 궁금합니다. 그게 어떻게 이루어 졌는지 아는 사람 있습니까?

신기원 한 의미에서 잘 작동하기 때문에 시간을 이용하여 지금

,하지만 시계가 저장되는 시간을 중지하고 계산하는 데 사용됩니다 스톱워치

를 다시 시작, 시작, & 정지의 문제를 복잡하게 시계가 다시 시작될 때의 오프셋이지만 시계가 다시 시작될 때 약간의 대기 시간이 도입되고 시간이 눈에 띄게 증가합니다.

근본 원인이나 해결책에 대한 생각은 크게 감사하겠습니다.

답변

22

이벤트 루프가 실행 중이 아니면 이벤트 루프를 다시 실행할 수있을 때까지 타이머가 실행되지 않습니다. 이벤트 루프가 블록이 아니더라도 타이머는 정확히 구성된 간격으로 실행되는 것이 보장되지 않습니다. 시간이 발사 된 타이머를 전제로 한 경우 오류의 양은 시간이 지남에 따라 커집니다.

타이머 작동과 별도로 지속 시간을 추적해야합니다. 타이머가 작동 할 때마다 지속 시간을 다시 계산하고 다시 표시하십시오. 시작시

  • (어느 쪽있는 NSDate 인스턴스로 또는 NSTimeInterval 값으로)

    • 잡아 시간을 : 시작/일시 정지/다시 시작

      는/설치의 유형을 중지, 당신은 일반적으로 원하는

      일시 중지 또는 중지시 일시 중지/정지시 시간을 확보하십시오. 이 시간에서 시작 시간을 빼기 당신은 간격의 기간을 다시 시작시

    • 이 다시 시작 에 시간을 잡아뿐만 아니라 이미 경과 기간 일시 정지시

    • 주위에 계속/중지 시간을 잡아/일시 중지하고 는 NSTimeInterval 값으로이 모든 일을, 일반적으로 이미 경과 기간

    를 추가 - 단지 배가되는 - 가장 쉬운 방법입니다. 그러나 이벤트가 발생한 실제 순간을 추적해야하는 경우 대신 NSDate 인스턴스를 사용하십시오.

  • 46

    bbum의 대답은 응용 프로그램을 설계하는 더 좋은 방법을 제공하지만 사용자가 UI를 조작하는지 여부에 관계없이 타이머를 실행하려면 runloop의 추적 모드에 타이머를 추가해야합니다.

    iPhone 용으로 개발한다고 가정하면이 모드는 UITrackingRunLoopMode입니다. Mac 용으로 개발중인 경우 NSEventTrackingRunLoopMode이라는 이름이 있습니다.

    NSRunLoop *runloop = [NSRunLoop currentRunLoop]; 
    NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(myTimerAction:) userInfo:nil repeats:YES]; 
    [runloop addTimer:timer forMode:NSRunLoopCommonModes]; 
    [runloop addTimer:timer forMode:UITrackingRunLoopMode]; 
    
    +1

    여전히 전체 타이밍의 정확성을 보장하지는 않습니다. 타이머는 설정된 간격으로 정확히 발사되는 것이 보장되지 않습니다. 더욱이, 각 타이머 발사가 전체 간격에 추가되면, 각 타이머 발사마다 오류 양이 증가합니다! – bbum

    +0

    나는 통제가 추적하는 동안 타이머가 발사하는 것 이외의 다른 것을 보장 할 것이라고 주장하려고하지 않았다. 랩 시작시 날짜를 저장하고이를 사용하여 경과 시간을 계산하면 답안에 명시된 것보다 훨씬 정확하고 간단합니다. –

    +0

    +1 나를 위해 일했습니다. bbum의 대답은 나에게 전혀 이해가되지 않았다. – bentford

    관련 문제