2014-03-07 107 views
1

我的意思是12:01:00,12:02:00 ...iOS如何在分鐘,每分鐘撥打一個方法

在iOS7中,我想在分鐘時間改變時調用方法。換句話說,如果現在是01:55:47,那麼我想在01:56:00 - > 01:57:00 - > 01:58:00打電話給方法...

我找到的所有關於調用方法只是關於TimeInterval,但不是我想要的。

我試過這段代碼:

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!"); 
} 

但這種方法不叫在第0秒

希望冷靜的人能幫幫我!

-----我的回答-------

我也明白,爲什麼我的代碼無法正常工作,我需要額外60秒添加到roundedInterval,這是確切的時間下一分鐘。如果不添加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

您的計時器設置爲一秒的間隔。現在,如果秒數爲00,則可以在委託函數內部檢查。如果是這樣,請調用您的函數。或在正確的時間打電話給你的delgate。我的意思是你必須打電話給你的delgate在00. –

回答

5

關鍵是要在正確的時間啓動循環計時器。獲取當前時間,並找出我們進入當前分鐘多少秒......

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

由此我們可以得到的秒數,直到下一分鐘......

NSInteger tillNextMinute = (60 - second) % 60; 

我還沒有測試過,但mod 60的想法是處理秒數爲零的情況。現在,我們幾乎完成了......

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

然後代碼你...

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

很酷,你給我另一種方法來解決這種情況。我還想知道爲什麼我的代碼無法正常工作,我需要在roundInterval中添加額外的60秒,這是下一分鐘的確切時間。如果不添加60秒,fireDate就會被傳遞,所以當我運行我的應用程序時,它必須立即啓動。 –

+0

我應該已經更清楚了,你可以刪除那個roundedInterval代碼。我的建議是四捨五入。只需要安排計時器。 – danh

+0

謝謝!你幫了我很多! –

2

開始目前公認的答案是不正確的,最多1秒。

這裏是如何獲得下一分鐘儘可能精確:

// 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]; 

});