NSTimer Logic在某处失败

时间:2016-05-12 14:42:29

标签: ios nstimer nsrunloop

我已经能够在我们的应用程序中重现两次缺陷,但大多数时候我都失败了。所以我试图了解这里可能会发生什么,并希望有一些新的尝试。我们的应用程序超时并使用NSTimer在10分钟后将用户注销。每次触摸屏幕时,计时器都会重置,这一切都很有效。

当用户为应用程序提供背景并返回时,将调用以下代码:

- (BOOL)sessionShouldTimeOut {
    if (self.timeoutManager) {
        NSTimeInterval timeIntervalSinceNow = [self.timeoutManager.updateTimer.fireDate timeIntervalSinceDate:[NSDate date]];

        if (timeIntervalSinceNow < 0) {
            return YES;
        } else {
            return NO;
        }

    }
    return NO;
}

- (void)timeoutIfSessionShouldTimeOut {
    if ([self sessionShouldTimeOut]) {
        [self.timeoutManager sendNotificationForTimeout];
    }
}

这(我怀疑)是失败的代码。失败时会发生什么,用户登录,点击主页并锁定手机。 10分钟后,他们解锁,应用程序未注销。当他们回来时,上面的代码被执行以记录用户,但在某些情况下它会失败 - 当用户不应该离开时仍留在主页上。

这是我目前正在尝试测试的理论:

  • 计时器以某种方式在后台触发,然后运行注销例程,但由于我们在后台,UI未更新但计时器无效(我们在注销后使计时器无效)I'我不确定在应用程序位于前台后是否会显示从后台调用的UI代码,因此这可能不太可能。

  • 用户实际上是在计时器开火前几秒钟回来,然后在应该点火几秒钟之后它就没有了,因为它已经背景了10分钟。如果应用程序进入后台,定时器是否会继续达到原始启动时间?

  • 不知何故,在后台,self.timeoutManagerupdateTimerfireDate被释放并设置为nil,导致sessionShouldTimeOut方法返回{ {1}}。变量可以在后台填充吗?如果可能的话会导致什么呢?

  • 当手机花一些时间实际移动到应用程序时,注销例程会运行,可能会导致UI更新无法反映出来吗?

我对其他理论持开放态度,因为你可以看到我的很多都是非常优势的,因为我根本不确定发生了什么。

我很感激任何人可以提供的任何指导,我可以尝试的其他内容,甚至任何有关NSTimer或NSRunLoop的工作的见解可能对这种情况有帮助(关于这些的文档对于我有问题)

1 个答案:

答案 0 :(得分:0)

AppDelegate.h集中 applicationDidEnterBackground

UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
         [[UIApplication sharedApplication] endBackgroundTask:locationUpdater];
        locationUpdater=UIBackgroundTaskInvalid;
     } ];

这告诉操作系统你还有事情要做,而不是阻止它。