在iOS应用程序中检测日变化
因此,我一直在研究如何在我的iOS应用程序中判断这是否是新的一天。基本上,我希望在新的一天开始时将一组值重置为0。我已经看到我可以使用“UIApplicationsSignificantTimeChangeNotification”,它在午夜发送通知。但是,如果用户在上午9:00关闭应用程序,并在第二天上午9:00再次打开应用程序,是否仍会触发此事件 我还看到我可以使用“NSCalendarDayChangedNotification”,据我所知,它具有相同的行为。我唯一担心的是,即使在用户关闭应用程序后,这两种方法中的任何一种是否都能检测到一天的变化 理想情况下,我希望在viewDidLoad的.m文件顶部添加通知观察员,如下所示:在iOS应用程序中检测日变化,ios,objective-c,nscalendar,Ios,Objective C,Nscalendar,因此,我一直在研究如何在我的iOS应用程序中判断这是否是新的一天。基本上,我希望在新的一天开始时将一组值重置为0。我已经看到我可以使用“UIApplicationsSignificantTimeChangeNotification”,它在午夜发送通知。但是,如果用户在上午9:00关闭应用程序,并在第二天上午9:00再次打开应用程序,是否仍会触发此事件 我还看到我可以使用“NSCalendarDayChangedNotification”,据我所知,它具有相同的行为。我唯一担心的是,即使在用户关闭
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resetValues) name:UIApplicationSignificantTimeChangeNotification object:nil];
然后在文件的其他地方
- (void)resetValues {
... // reset values to 0
}
目标是在每天更改开始时触发此通知。上面的代码能实现我想要的行为吗?在
NSUserDefaults
- 在AppDelegate中创建一个方法
,该方法将当前日期的checkDayChange
组件与day
中保存的值进行比较(默认值为0)。如果值不相等,请调用NSUserDefaults
并保存当前日期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。