【发布时间】:2014-02-25 14:51:33
【问题描述】:
我正在做的事情应该是一个简单的计算,涉及诸如 int64_t、NSTimeInterval 和 NSDate 之类的东西,以便跟踪令牌的到期时间,该令牌在其获取后一小时内到期并被刷新(换一个新的)每 50 分钟。
我使用的代码大部分时间都有效,但每隔一段时间(例如)它就会计算出自上次令牌交换以来经过的时间是 16,000 天。显然某处有些地方很不对劲,但我只是没有看到。
代码如下:
1) 获取一个新的令牌,它的到期时间以秒为单位给出,直到令牌到期,始终是 3600 秒,或 1 小时。我以秒为单位取这个值,并将其添加到自 1970 年以来以秒为单位的当前时间,并将其作为 int64_t 值存储在核心数据中:
NSTimeInterval secondsSince1970 = [[NSDate date] timeIntervalSince1970];
NSTimeInterval secondsUntilExpirationFrom1970 = secondsSince1970 + [[responseObject objectForKey:@"expires_in"]doubleValue];
account.tokenExp = [self.dataManager updateOAuthTokenExpirationDateForAccount:account tokenExpiration:secondsUntilExpirationFrom1970]; //method that saves to managed object context
2) 现在,每次需要使用令牌时,我都会先查看是否在 10 分钟或 600 秒内过期。如果是,我要求一个新的,如果不是,我不。
- (BOOL)tokenRequiresRefreshForAccount:(Account*)account
{
NSTimeInterval secondsSince1970 = [[NSDate date] timeIntervalSince1970];
NSTimeInterval secondsUntilTokenExpiration = account.tokenExp - secondsSince1970;
//account.tokenExp is the saved expiration of the token (a double) in core data
NSLog(@"There are %f minutes until the token expires and we %@ the token.", secondsUntilTokenExpiration / 60, secondsUntilTokenExpiration < 600 ? @"will refresh" : @"will not refresh");
return secondsUntilTokenExpiration < 600;
}
正如我所说,上述日志最近返回的值等于自上次检查以来已过去 16,000 天,这是在表示距离令牌到期还有 45 分钟的日志后 3 分钟记录的。
如果有人能看到我的错误或有更好的方法来获得相同的结果,我将非常感激。
更新
我看过一些关于“下溢”数字变量的帖子。变量“secondsUntilTokenExpiration”有时是一个相当负数......我是否有可能下溢这个变量?我尝试将其存储为 int64_t 和 NSTimeInterval 并且两者都会偶尔产生(非常)不正确的值。如果这可能是问题所在,我应该如何存储这个值?
【问题讨论】:
-
在我看来,您可能对从 double 到 int 与显式转换的隐式转换有所了解。 (我很惊讶编译器实际上并没有尖叫血腥谋杀。)
标签: ios objective-c int nsdate nstimeinterval