在iOS应用中检测日期更改

Fai*_*yed 2 objective-c nscalendar ios

因此,我一直在研究如何确定iOS应用程序是否是新的一天。基本上,我希望新的一天开始时将一堆值重置为0。我已经看到可以使用“ UIApplicationSignificantTimeChangeNotification”在午夜发送通知。但是,如果用户在9:00 AM处终止了该应用程序并在第二天9:00 AM再次打开该应用程序,这还会触发吗?

我还看到我可以使用“ NSCalendarDayChangedNotification”,据我了解,该行为具有相同的行为。我唯一关心的是,即使在用户终止应用程序之后,这两个方法中的任何一个是否都能完成检测日期变化的操作。

理想情况下,我想将通知观察者添加到viewDidLoad的.m文件顶部,如下所示:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resetValues) name:UIApplicationSignificantTimeChangeNotification object:nil];
Run Code Online (Sandbox Code Playgroud)

然后在文件中的其他地方...

- (void)resetValues {

... // reset values to 0

}
Run Code Online (Sandbox Code Playgroud)

目标是在每天更改开始时触发此通知。上面的代码能实现我想要的行为吗?

vad*_*ian 5

在其中保存整数值(日期)的解决方案 NSUserDefaults

  • 在AppDelegate中创建一个方法checkDayChange,该方法将day当前日期的组成部分与保存的值进行比较NSUserDefaults(默认为0)。如果值不相等,请致电resetValues并保存当前日期。

    - (void)checkDayChange
    {
       NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
       NSInteger currentDay = [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:[NSDate date]];
       NSInteger savedDay = [defaults integerForKey:@"day"]; // default is 0
       if (currentDay != savedDay) {
           [self resetValues];
           [defaults setInteger:currentDay forKey:@"day"];
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • NSCalendarDayChangedNotification用选择器观察checkDayChange

  • checkDayChange也致电applicationDidFinishLaunchingapplicationDidBecomeActive