0

これが私のコードです:

NSDate *currDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSString *currentTime = [dateFormatter stringFromDate:currDate];

NSDate *now = [NSDate date];
int interval = 1*60; // one minute (minutes*60)
long int nowSeconds = (long int) [now timeIntervalSince1970];
int secondsLeft = interval - (nowSeconds % interval);

NSDate *nextIntervalDate =  [NSDate dateWithTimeIntervalSince1970:nowSeconds+secondsLeft];

NSString *nextTrigger = [dateFormatter stringFromDate:nextIntervalDate];

timeRemaining.text = [NSString stringWithFormat:@"%02d:%02d", secondsLeft/60, secondsLeft%60];

NSLog([NSString stringWithFormat:@"%@:%@", currentTime, nextTrigger]);

if ([currentTime isEqualToString:nextTrigger]) {

}

問題は、'if([currentTime isEqualToString:nextTrigger])'が決して等しくないことです。nextTriggerは、等しくなる前に次のタイムセグメントに変更されるためです。NSLogは次のとおりです。

2013-01-17 15:54:59.987 app[35987:c07] 15:54:59:15:55:00
2013-01-17 15:54:59.997 app[35987:c07] 15:54:59:15:55:00    
2013-01-17 15:55:00.007 app[35987:c07] 15:55:00:15:56:00   <----RIGHT HERE
2013-01-17 15:55:00.016 app[35987:c07] 15:55:00:15:56:00

私のコードのnextTriggerは、基本的に現在の時刻を最も近い分で切り上げたものです。また、このコードセグメント全体は、0.1秒ごとに繰り返されるNSTimerにあります。

どうすればこれを修正できますか?

4

2 に答える 2

0

次の1分が経過したときにトリガーするコードがある場合、その時間が経過したかどうかを繰り返しチェックするのは非効率的です。そのコードを独自のメソッドに配置し、適切なタイミングでトリガーする単一のNSTimerを作成します。

NSDate* date = [NSDate date] ;
NSCalendar* calendar = [NSCalendar currentCalendar] ;

NSDateComponents* secondsComponents = [calendar components:NSSecondCalendarUnit fromDate:date] ;
NSTimeInterval secondsUntilNextWholeMinute = 60 - secondsComponents.second ;
[NSTimer scheduledTimerWithTimeInterval:secondsUntilNextWholeMinute  target:self  selector:@selector(yourMethod)  userInfo:nil  repeats:NO ] ;
于 2013-01-17T21:42:34.443 に答える
-1

私はやや似たような問題を抱えていました。私がやったことは、コピーを作成してそれをチェックすることでした(1つは、両方を持っていてoldTriggernewTriggerすでに宣言されていることです)このコードをチェックしてください

NSDate *currDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSString *currentTime = [dateFormatter stringFromDate:currDate];

NSDate *now = [NSDate date]; 
int interval = 1*60; // one minute (minutes*60)
long int nowSeconds = (long int) [now timeIntervalSince1970];
int secondsLeft = interval - (nowSeconds % interval);

NSDate *nextIntervalDate =  [NSDate dateWithTimeIntervalSince1970:nowSeconds+secondsLeft];
oldTrigger = nextTrigger;
nextTrigger = [dateFormatter stringFromDate:nextIntervalDate];

timeRemaining.text = [NSString stringWithFormat:@"%02d:%02d", secondsLeft/60, secondsLeft%60];

NSLog([NSString stringWithFormat:@"%@:%@", currentTime, nextTrigger]);

if ([currentTime isEqualToString:oldTrigger]) {

}
于 2013-01-17T21:44:05.900 に答える