2014-09-30 4 views
1

NSDates를 올바르게 사용하는 방법을 이해하는 데 어려움을 겪고 있습니다.NSDates 및 TimeIntervals

은 내가 timingDate = [NSDate date];

를 인스턴스화하는 이벤트를 가지고 내가 나중에 사용자의 터치 betweeen 시간 간격을 기록하는 것에. 그래서 timingDate와 사용자 터치 사이의 간격을 밀리 초 단위로 찾고 싶습니다. 그런 다음 touchDate를 touchTime과 같게 재설정하여 다음에 화면을 터치하면 이전 터치와 현재 터치 사이의 차이를 찾을 수 있습니다. 나는 그것이 의미가 있기를 바랍니다. 하지만 NSDates 또는 NSIntervals를 사용하는 방법을 이해할 수 없기 때문에 서클에서 돌아 다니고 있습니다. 속성 간격 touchTime 및 timingDate는 모두 현재 NSDate 유형입니다. - 맞습니까?

그래서 내가

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    touchTime = timingDate; 
    interval = [[NSDate date] timeIntervalSinceDate:timingDate]; // should be the time difference from when the timingDate was first set and when the user touched the screen. 
    touchTime = [[[NSDate date]timeIntervalSinceDate:timingDate]doubleValue]; 
    timingDate = [NSDate dateWithTimeIntervalSinceReferenceDate:touchTime]; 
    NSLog(@"Time taken Later: %f", [[NSDate date]timeIntervalSinceDate:timingDate]); 
    } 
+1

'timeIntervalSinceDate'는 객체 유형이 아니라 간단한 숫자 유형 인 'NSInterval'을 반환합니다. 이것은 실제로'double'의 별칭입니다. 따라서'NSInterval'을'double'으로 변환하기 위해서는'doubleValue'가 아닌'(double)'을 사용하여 간단하게 캐스트 할 수 있습니다. –

답변

1

코드가 약간 복잡합니다! timingDate과 터치가 발생한 시간의 차이를 계산 한 다음 timingDate을 현재 시간으로 설정하면 모든 터치 이벤트에서이 계산을 수행 할 수 있습니다.

timingDate과 첫 번째 터치의 차이점을 찾으려면 NSDate의 timeIntervalSinceDate을 현재 시간과 함께 사용할 수 있습니다. NSTimeInterval 값을 반환합니다.이 값은 밀리 초 단위의 정밀도로 초 단위의 시간 값을 나타냅니다.

NSDate *currentDate = [NSDate date]; 
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:timingDate]; 
NSLog(@"Time taken: %f seconds/%f milliseconds",timeInterval,timeInterval*1000); 

그런 다음, 현재 시간에 timingDate을 설정하려면, 단순히 timingDate = currentDate;를 사용하는 예를 들면 다음과 같습니다이다. 이를 통해 터치 간의 시간차를 지속적으로 측정 할 수 있습니다.

+0

물론 - 내가 왜 당신이 제안한 것처럼 timingDate를 리셋하지 않았는지 모르겠다. 도와 줘서 고맙다. –

+0

몇 가지 제안 : 1)'[NSDate date]'를 두 번 호출하지 마십시오. 결국 두 가지 다른 날짜로 끝나고 시간이 지남에 따라 합산되지 않습니다. 2)'[NSDate date]'를 사용하는 대신. 실제 이벤트에서 타임 스탬프를 가져옵니다. 'NSTimeInterval touchTimestamp = [[touches anyObject] timestamp]; ' – rmaddy

+0

@rmaddy 좋은 점, [NSDate date]가 한 번만 호출되도록 코드를 편집했습니다. 재 : UITouch 타임 스탬프,이 접촉의 시간 차이를 계산하는 데 사용할 수 있지만 나는 첫 접촉에 믿습니다, OP는 다른 곳에 설정된 NSDate 날짜에서 차이를 계산하는 데 필요한. – ttarik

1

NSTimeInterval 같은 다른 것들을 많이 시도했습니다 것은 초를 나타내는 두 배입니다.

NSDate은 날짜/시간을 보유하는 개체입니다.

@property(nonatomic, strong) NSDate * lastTouchDate; 

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    NSTimeInterval secondsSinceLastTouch = 0; 

    if(self.lastTouchDate){ 

     secondsSinceLastTouch = [[NSDate date] timeIntervalSinceDate:self.lastTouchDate]; 

     NSLog(@"It's been %.1f seconds since the user touched the screen", secondsSinceLastTouch); 

    }else{ 

     NSLog(@"This is the first time the user touched the screen"); 

    } 

    self.lastTouchDate = [NSDate date]; 

} 

하면 초기화 후 self.lastTouchDate를 업데이트하지, 당신이 그것을 만진 마지막 시간 사이의 간격을 원하지 않는 경우 날짜가 이후는 초 것 : 여기

은 예입니다 초기화 됨.

1

따라서 이해해야 할 첫 번째 점은 -[NSDate timeIntervalSinceDate:]NSTimeInterval을 반환한다는 것입니다. 실제로는 단지 이중 값입니다.

위의 예에서 변수를 유형으로 선언하지 않았지만 변수 interval의 값을 보면 timingDate으로 표시된 시간 이후 10 진수 값이어야합니다.


timingDateNSDate 목적이라고 가정하고,이 코드가 실행되기 전에,이 코드는 디버그 콘솔에 시간 (초)을 인쇄해야합니다 설정되어 있습니다.

NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:timingDate]; 
NSLog(@"Time between touches %f", interval); 

여기 경우에 당신이 문제를 찾는 데하고는있는 NSDate 클래스 문서입니다. (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/index.html#//apple_ref/doc/c_ref/NSDate)

+1

사실 그것은 NSTimeInterval 문서입니다. NSDate는 https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/index.html#//apple_ref/doc/c_ref/NSDate에 있습니다. –

+0

D' oh! 고마워요. Hot Licks. 위 링크를 수정하겠습니다. –