Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS应用程序中检测日变化_Ios_Objective C_Nscalendar - Fatal编程技术网

在iOS应用程序中检测日变化

在iOS应用程序中检测日变化,ios,objective-c,nscalendar,Ios,Objective C,Nscalendar,因此,我一直在研究如何在我的iOS应用程序中判断这是否是新的一天。基本上,我希望在新的一天开始时将一组值重置为0。我已经看到我可以使用“UIApplicationsSignificantTimeChangeNotification”,它在午夜发送通知。但是,如果用户在上午9:00关闭应用程序,并在第二天上午9:00再次打开应用程序,是否仍会触发此事件 我还看到我可以使用“NSCalendarDayChangedNotification”,据我所知,它具有相同的行为。我唯一担心的是,即使在用户关闭

因此,我一直在研究如何在我的iOS应用程序中判断这是否是新的一天。基本上,我希望在新的一天开始时将一组值重置为0。我已经看到我可以使用“UIApplicationsSignificantTimeChangeNotification”,它在午夜发送通知。但是,如果用户在上午9:00关闭应用程序,并在第二天上午9:00再次打开应用程序,是否仍会触发此事件

我还看到我可以使用“NSCalendarDayChangedNotification”,据我所知,它具有相同的行为。我唯一担心的是,即使在用户关闭应用程序后,这两种方法中的任何一种是否都能检测到一天的变化

理想情况下,我希望在viewDidLoad的.m文件顶部添加通知观察员,如下所示:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resetValues) name:UIApplicationSignificantTimeChangeNotification object:nil];
然后在文件的其他地方

- (void)resetValues {

... // reset values to 0

}

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

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"];
       }
    }
    
  • 使用选择器观察
    NSCalendarDayChangedNotification
    checkDayChange

  • applicationIDFinishLaunching
    applicationIDBecomeActive

ui应用程序重要时间更改通知仅在应用程序运行时有用。但请注意,调用它的原因可能不是午夜更改日期。我明白了,所以我最好只创建当前日期的存储值,然后继续检查/覆盖它?是的。你需要这样做。啊,所以我要做的就是观察我的AppDelegate.m中的NSCalendarDayChangedNotification,然后checkDayChange方法将处理覆盖当前日期并重置值的操作。如果用户杀死应用程序,通知不会变得无用吗?只有当应用程序处于活动状态时,通知才有用,否则,检查总是在应用程序启动或变为活动状态时执行。因此,即使用户在一天中的某个时间杀死应用程序,检查将在第二天执行,并在调用重置时更新保存的日期method@FaisalSyed是的,完全正确。警告:在后台线程中调用NSCalendarDayChangedNotification。