NSTimeInterval,NSDate& int64_t产生不合理的时间计算

时间:2014-02-01 23:23:16

标签: ios objective-c int nsdate nstimeinterval

我正在做什么应该是一个简单的计算,涉及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天,这是在日志之后3分钟记录的,该日志表示在令牌到期之前剩余45分钟。

如果有人能看到我的错误或者有更好的方法来获得相同的结果,我会非常感激。

更新

我看过一些关于'下溢'数字变量的帖子。变量“secondsUntilTokenExpiration”有时候是一个相当负数......我可能正在使这个变量下溢吗?我已经尝试将其存储为int64_t和NSTimeInterval,并且两者偶尔产生(非常)不正确的值。如果这可能是问题,我应该如何存储这个值?

1 个答案:

答案 0 :(得分:0)

首先要想到的是确保用于派生值的函数调用之一不会降低精度(NSDate,round,responseObject ...)。这有点紧张,但这就是我现在所能看到的。