2014-03-07 3 views
1

12시 01 분 00 초, 12시 2 분 0 초 ...iOS 분마다 메서드 호출 방법

iOS7에서 분 시간이 변경되면 메서드를 호출하고 싶습니다. . 즉, 지금 01:55:47이면 01:56:00 -> 01:57:00 -> 01:58:00 ...

모두를 호출하는 방법입니다. 메서드에 대한 호출은 TimeInterval에 관한 것입니다.하지만 원하는 것은 아닙니다. 나를 도울 수

0 초 희망 멋진 사람들에

NSTimeInterval roundedInterval = round([[NSDate date] timeIntervalSinceReferenceDate]/60.0) * 60.0; 
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:roundedInterval]; 

NSTimer *timer = [[NSTimer alloc] initWithFireDate:date 
              interval:60.0 
              target:self 
              selector:@selector(handleEveryMinutes:) 
              userInfo:nil 
              repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

- (void)handleEveryMinutes:(NSTimer *)timer { 
NSLog(@"one minute!"); 
} 

그러나이 방법은 호출되지 않습니다 :

나는이 코드를 시도했습니다!

----- 내 대답 -------

나는 또한 내 코드가 제대로 작동하지 않는 이유는, 내가의 정확한 시간입니다 roundedInterval에 추가로 60 초 동안 추가 필요 알아낼

다음 분. 60 초를 추가하지 않으면 fireDate가 전달되므로 앱을 실행할 때 즉시 실행해야합니다.

NSTimeInterval roundedInterval = round([[NSDate date] timeIntervalSinceReferenceDate]/60.0) * 60.0 + 60; // the extra 60 is used to set the correct time Interval between next minute and referenced date. 
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:roundedInterval]; 

이제 작동합니다!

+0

1 초 간격으로 타이머를 설정합니다. 이제 초가 00이면 델리게이트 함수 내부를 확인할 수 있습니다. 그렇다면 함수를 호출하십시오. 또는 적절한 때에 델리게이트에 전화하십시오. 나는 00시에 델리게이트에 전화해야한다는 것을 의미합니다. –

답변

5

열쇠는 적절한 시간에 반복 타이머를 시작하는 것입니다. ...이에서

NSDateComponents *components = [[NSCalendar currentCalendar] components: NSSecondCalendarUnit fromDate:[NSDate date]]; 
NSInteger second = [components second]; 

우리가 다음 순간까지 (초)을 얻을 수 있습니다 ...

NSInteger tillNextMinute = (60 - second) % 60; 

I를 현재 시간을 가져 우리는 현재 분에 얼마나 많은 초 발견 그것을 테스트하지는 못했지만 mod 60의 아이디어는 초가 0 인 경우를 처리하는 것입니다. 이제 우리는 거의 ... 완료

[self performSelector:@selector(startTimer) withObject:nil afterDelay:tillNextMinute]; 

그런 다음 코드는 현재 허용 대답은 최대 1 초에 의해 잘못된 것으로 ...

- (void)startTimer { 
    // contains the code you posted to start the timer 
} 
+0

시원한데,이 상황을 해결할 또 다른 방법을 제공합니다. 또한 코드가 올바르게 작동하지 않는 이유를 알아 냈습니다. roundedInterval에 추가 60 초를 추가해야하는데, 다음 초의 정확한 시간입니다. 60 초를 추가하지 않으면 fireDate가 전달되므로 앱을 실행할 때 즉시 실행해야합니다. –

+0

더 명확해야했는데, roundedInterval 코드를 삭제할 수 있습니다. 내 제안은 반올림을 수행합니다. 그냥 타이머를 예약해야합니다. – danh

+0

감사! 너 나 좀 도와 줘! –

2

시작했다. 여기

은 가능한 한 정확하게 다음 분을 받으시는 방법 :

// set clock to current date 
NSDate *date = [NSDate date]; 
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSSecondCalendarUnit fromDate:date]; 

NSTimeInterval timeSinceLastSecond = date.timeIntervalSince1970 - floor(date.timeIntervalSince1970); 
NSTimeInterval timeToNextMinute = (60 - dateComponents.second) - timeSinceLastSecond; 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeToNextMinute * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 

    [self handleEveryMinutes:nil]; 

});