在我的应用程序的顶部,我有一个大字体的日期和时间。系统时间仍然显示在顶部的iOS标题栏中。
我想在这个标签上显示确切的时间,但是我目前的做法有一个延迟。在当前的方法中,延迟小于一秒有时是有意义的,但有时甚至是5秒。在模拟器中几乎没有延迟。
目前的做法:
-(void)viewDidLoad {
// Start timer for every minute to update date and time
long seconds = [_dateCalendar component:NSCalendarUnitSecond fromDate:[NSDate date]];
_timerEveryMinute = [NSTimer scheduledTimerWithTimeInterval:((long)60 - seconds) target:self selector:@selector(setInitialTimer) userInfo:nil repeats:NO];
}
-(void)setInitialTimer {
_timerEveryMinute = [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(doEveryMinute) userInfo:nil repeats:YES];
[self doEveryMinute];
}
-(void)doEveryMinute {
[self setTopDate:[NSDate date]];
}
-(void)setTopDate:(NSDate *)date {
NSMutableArray *dateStrings = [[NSMutableArray alloc]init];
[_dateFormatter setDateFormat:@"d MMMM"];
[dateStrings addObject:[_dateFormatter stringFromDate:date]];
[_dateFormatter setDateFormat:@"YYYY"];
[dateStrings addObject:[_dateFormatter stringFromDate:date]];
[_dateFormatter setDateFormat:@"HH:mm"];
[dateStrings addObject:[_dateFormatter stringFromDate:date]];
NSMutableAttributedString *dateStringStyled = [[NSMutableAttributedString alloc] initWithString:[dateStrings componentsJoinedByString:@" "]];
[dateStringStyled addAttribute:NSFontAttributeName
value:[UIFont roomLightWithSize:36]
range:NSMakeRange( ((NSString *)dateStrings[0]).length + 1, ((NSString *)dateStrings[1]).length)];
_lblDate.attributedText = dateStringStyled;
[_dateFormatter setDateFormat:@"EEEE"];
_lblWeekday.text = [_dateFormatter stringFromDate:date];
}
简而言之..我的第一个初始定时器设置为在剩余的秒数运行,直到下一分钟。之后我将我的计时器设置为每分钟运行一次。
我想在某种程度上可以在下一分钟开始一种方法。像'观察时钟直到......'之类的东西。
有什么想法吗?
[22:33]添加了setTopDate。 尽管不是那么多......
[day + 1]完整解决方案
如果它可以帮助其他人,下面的完整代码可以在1分钟内执行某些操作。当然,同样的方法可以工作几秒钟或几小时。
@interface
@property (nonatomic, strong) NSDateComponents *minuteComponent;
@end
@implementation
-(instancetype)init {
self = [super init];
if(self) {
_minuteComponent = [[NSDateComponents alloc] init];
_minuteComponent.minute = 1;
[self doEveryMinute];
}
}
-(void)doEveryMinute {
NSLog(@"Minute passed: %@", [NSDate date]);
// Shedule itself again to run at the next minute
NSDateComponents *flatComponent = [_dateCalendar components:(NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute)
fromDate:[NSDate date]];
NSDate *flatMinute = [[NSCalendar currentCalendar] dateFromComponents:flatComponent];
flatMinute = [_dateCalendar dateByAddingComponents:_minuteComponent toDate:flatMinute options:0];
[[NSRunLoop currentRunLoop]addTimer:[[NSTimer alloc]initWithFireDate:flatMinute
interval:0
target:self
selector:@selector(doEveryMinute)
userInfo:nil
repeats:NO]
forMode:NSDefaultRunLoopMode];
//Execute some code every minute
}
@end
答案 0 :(得分:2)
您可以创建在指定时间点火的计时器。
使用initWithFireDate:interval:target:selector:userInfo:repeats:
的{{1}}方法创建此类计时器,并将NSTimer
addTimer:forMode:
添加到当前运行循环中。
我的方法是创建一个非重复计时器,以便在下一整分钟时触发,并在每次触发前一个计时器时创建一个新计时器。这样,您就可以确定计时器与现实世界时间保持同步。