如何在UILabel中打印确切的时间并使其保持最新?

时间:2015-01-18 21:23:30

标签: ios objective-c

在我的应用程序的顶部,我有一个大字体的日期和时间。系统时间仍然显示在顶部的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

1 个答案:

答案 0 :(得分:2)

您可以创建在指定时间点火的计时器。

使用initWithFireDate:interval:target:selector:userInfo:repeats:的{​​{1}}方法创建此类计时器,并将NSTimer addTimer:forMode:添加到当前运行循环中。

我的方法是创建一个非重复计时器,以便在下一整分钟时触发,并在每次触发前一个计时器时创建一个新计时器。这样,您就可以确定计时器与现实世界时间保持同步。