2009-11-06 2 views
0

나는 응용 프로그램을 만들었습니다. 카운트 다운 타이머를 시작하고 데이터베이스에 이중 값으로 현재 날짜를 저장합니다. 또한 카운트 다운 타이머에 따라 종료일을 저장합니다. 종료 후 응용 프로그램으로 돌아가서 시간 형식 데이터베이스를 얻게됩니다. 현재 날짜와 시작 날짜를 설정하고 that.but에 따라 카운트 다운을 설정하면 문제가 발생합니다. 시간이 8 시간 앞당겨지면 카운트 다운 타이머가 다르게 동작합니다. 사용자가 시간 또는 시간대를 변경 한 것을 발견합니까? 에 의해 나는 시간대를 변경하면 새로운 델리가 잘 작동하지만 같은 시간대에서 내가 늘리거나 줄이면 날짜 또는 시간이 예상대로 작동하지 않는다고 생각합니다. 이걸 어떻게 관리합니까? 증가/감소 날짜 나 시간은 앱이 바로 드릴 수 없습니다 launched.i 그것은 당신의 타이머가 정확하려면해당 사용자가 iPhone SDK에서 시간이 변경된 것을 찾는 방법은 무엇입니까?

답변

3

그것을 알아낼으로 닫을 때

또한 난 당신이 단지를 사용해야 이상한 문제를 보았다 종료일. 나는 왜 당신이 시작 날짜를 지키고 싶어하는지 모르겠다. 여기

연속 카운트 다운 예입니다 :

// I'm assuming you want to update the countdown every seconds 
// So you should set a timer like this somewhere 
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick) userInfo:nil repeats:YES]; 

- (void)updateCountdown { 
    NSTimeInterval timeInterval = [endDate timeIntervalSinceNow]; 

    unsigned int d, h, m, s; 
    NSTimeInterval r; 

    d = timeInterval/(24 * 3600); 
    r = timeInterval - d * 24 * 3600; 

    h = r/3600; 
    r = r - h * 3600; 

    m = r/60; 
    r = r - m * 60; 

    s = r; 

    NSString *countdown = [NSString stringWithFormat:@"%.2d:%.2d:%.2d:%.2d", d, h, m, s]; 
    // Now you could use countdown to update the text of a UILabel 
} 

- (void)timerTick { 
    if ([endDate compare:[NSDate date]] == NSOrderedDescending) { 
     //endDate is later in time than "now", ie not yet reached 
     [self updateCountdown]; 
    } else { 
     //stop the countdown 
     [timer invalidate]; 
    } 
} 

endDate 카운트 다운이 모든 초 조정되기 때문에 카운트 다운이 0

에 도달해야하는 날짜를 포함하는있는 NSDate해야 당신은하지 않습니다 시스템 시간 또는 시간대가 변경 되더라도 문제가 발생합니다.

그러나 앱을 다시 시작하거나 종료 할 때 endDate를 올바르게 저장하고 복원해야합니다. 즉, 항상 고정 참조를 사용해야합니다. NSDate 클래스의 timeIntervalSinceReferenceDate 및 dateWithTimeIntervalSinceReferenceDate :를 사용합니다.

0

한 번이 같은 endDate 사용 뭔가 타이머 발사를 가진 단지 관심이 있다면 : 나는 당신이 응용 프로그램 ISN '동안 시간을 ​​변경하는 사용자의 주위에 얻을 수있는 방법 확실하지 않다

NSTimer* timer = [[NSTimer alloc] initWithFireDate:endDate 
              interval:0.0f 
              target:self 
              selector:@selector(endDateReached:) 
              userInfo:nil 
              repeats:NO]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
[timer release]; 
0

실행 중. 하지만 당신이 startDate 또는 타이머의 기간을 저장할 필요가 있다고 생각하지 않습니다. 당신이 할 수있는 일은 endDate를 데이터베이스에 저장하는 것입니다. 나는 그리니치 표준시와 같은 시간대를 불가지론 방식으로 시도하고 저장할 것이다.

그런 다음 응용 프로그램이 다음에 시작될 때 데이터베이스에 저장된 날짜를 가져 와서 다시 현지 시간으로 변환하십시오. 또한 응용 프로그램이 시작될 때 NSDate 클래스에서 현재 시간을 가져옵니다. 그러면 변환 된 endDate에서 현재 시간을 빼서 타이머 지속 시간을 계산할 수 있습니다.

사용자가 시간대를 변경하고 올바른 시간에 화재 이벤트를 발생시킬 수 있어야합니다. 또한 데이터베이스에 저장하는 것이 적을 것입니다.

+0

나는 정확하게 당신이 말하는 것을하고 있습니다. 나는 db에 끝 날짜를 저장하고 있습니다. 다시 실행하면 로컬 시간이 생깁니다.하지만 nsdate 클래스에서 현재 시간을 얻으면 2 시간 후에 현재 nsdate가 잘못 반환됩니다. 시간. 그 끝 날짜와 현재 날짜 사이의 차이가 예상대로되지 않습니다. 그 proble.how 나는이 문제를 극복합니까 –

관련 문제