NSTimer 复位后不工作

NSTimer not working after reset

我有一个 NSTimer,它应该在应用程序处于前台时工作,但在应用程序进入后台时应该停止。但如果再次来到前台,计时器将无法正常工作。有什么办法吗?

inbox.m

(viewDidLoad){
    myTimer = [NSTimer scheduledTimerWithTimeInterval: 0.60 target: self selector: @selector(saveSlow) userInfo: nil repeats: YES];
   if([[NSUserDefaults standardUserDefaults] boolForKey:@"enterBG"]==YES)
   {
        [myTimer invalidate];
        myTimer = nil;
   }
 ....
 }

您不能在您的项目中尝试此代码

UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
    UIApplication *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
    NSTimer  *timer = [NSTimer scheduledTimerWithTimeInterval:0.60 target:self   selector:@selector(timerMethod) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];



-(void) timerMethod{

    NSLog(@"in Vijay yadav ");
}

尝试删除:

[myTimer invalidate];
myTimer = nil;

因为计时器将在 3 分钟后在后台停止工作。当你来到前台时,它会自动运行。通过使无效和零,您将删除计时器的实例。在这种情况下,您必须再次初始化计时器。

是否在应用进入前台后重新设置了enterBG的bool值?如果没有,即使生成了定时器,稍后也会再次失效。

还有一点,你在-viewDidLoad中生成了你的定时器,一般来说,view life loop只调用它一次。下次您的应用程序进入前台时,它不会被调用。这可能是您的计时器不再工作的另一个原因。 您可以尝试将其改为 -viewWillAppear: 您需要手动调用代码片段。

还有一个建议,你最好使用相关的通知来处理定时器:

UIApplicationDidEnterBackgroundNotification
UIApplicationWillEnterForegroundNotification