关于时间戳大家并不陌生。最近项目需要持续获取更新时间戳。
// 获取毫秒级时间戳
+(NSString *)getNowTimeTimestamp_millisecond{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss SSS"];
NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
[formatter setTimeZone:timeZone];
NSDate *datenow = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)([datenow timeIntervalSince1970]*1000)];
return timeSp;
}
我们首选获取时间戳
CGFloat time = [[ToolManager getNowTimeTimestamp_millisecond] floatValue];
得到时间戳 :1728895254528
我们校验一下,没有问题。
然后我们创一个最后时间与一个NSTimer
@property (nonatomic, assign)CGFloat lastTime;
@property (nonatomic, strong)NSTimer *yj_Timer;
初始化,每100毫秒执行一次(这里不考虑NSTimer的精准,一般情况下也不会遇到精准问题)
_lastTime = [ToolManager getNowTimeTimestamp_millisecond].floatValue;
_yj_Timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerClicked) userInfo:nil repeats:YES];
做时间对比
-(void)timerClicked{
CGFloat nowTime = [[ToolManager getNowTimeTimestamp_millisecond] floatValue];
NSLog(@"时间戳测试 当前时间:%f 最后一次时间:%f",nowTime,_lastTime);
/// 当最后一次操作与当前时间差,大于1500毫秒后,任务没有任务在继续了
if (nowTime - _lastTime > 1500){
// 执行后续操作...
}
}
问题出现了。在100毫秒的重复下,时间戳竟然是相同的。大概需要等30多秒才能执行完毕。到if判断内
这里由于我没有停止timer,所以一直在输入日志。
我们换一种写法。这里我们不在使用 CGFloat 接收,使用 double
@property (nonatomic, assign)double lastTime;
NSLog(@"时间戳测试 CGFloat : %f",[ToolManager getNowTimeTimestamp_millisecond].floatValue);
NSLog(@"时间戳测试 Double : %f",[ToolManager getNowTimeTimestamp_millisecond].doubleValue);
_lastTime = [ToolManager getNowTimeTimestamp_millisecond].doubleValue;
_yj_Timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerClicked) userInfo:nil repeats:YES];
-(void)timerClicked{
double nowTime = [[ToolManager getNowTimeTimestamp_millisecond] doubleValue];
NSLog(@"时间戳测试 当前时间:%f 最后一次时间:%f",nowTime,_lastTime);
/// 当最后一次操作与当前时间差,大于1500毫秒后,任务没有任务在继续了
if (nowTime - _lastTime > 1500){
[_yj_Timer invalidate];
// 执行后续操作...
}
}
再来看日志
这次就可以很明显看到时间戳的变化了。
对于一个做了8年开发的我来说,犯了这种低级错误实在不应该。
平常我们使用时间戳做格式化不管是float还是double 都没有问题,问题就出现在持续获取的情况下。
本来是个小问题,但是我开始没想到是这么低级的错误,对着GCD的多线程一顿操作,最终发现了这个问题。😌,惭愧啊。
希望我的遭遇可以帮助正在遇到这个问题你。