检测 iOS 应用中的日期变化
Detecting Day Change in iOS App
所以我一直在研究如何在我的 iOS 应用程序中判断今天是否是新的一天。基本上,我想在新的一天开始后立即将一堆值重置为 0。我已经看到我可以使用 "UIApplicationSignificantTimeChangeNotification" 在午夜发送通知。但是,如果用户在 9:00AM 关闭应用程序并在第二天 9:00AM 再次打开它,这是否仍会触发?
我还看到我可以使用 "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"];
}
}
使用选择器checkDayChange
观察NSCalendarDayChangedNotification
- 也在
applicationDidFinishLaunching
和applicationDidBecomeActive
中调用checkDayChange
系统观察者:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(reloadData) name:NSCalendarDayChangedNotification object:nil];
https://developer.apple.com/documentation/foundation/nscalendardaychangednotification?language=objc
所以我一直在研究如何在我的 iOS 应用程序中判断今天是否是新的一天。基本上,我想在新的一天开始后立即将一堆值重置为 0。我已经看到我可以使用 "UIApplicationSignificantTimeChangeNotification" 在午夜发送通知。但是,如果用户在 9:00AM 关闭应用程序并在第二天 9:00AM 再次打开它,这是否仍会触发?
我还看到我可以使用 "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"]; } }
使用选择器
checkDayChange
观察- 也在
applicationDidFinishLaunching
和applicationDidBecomeActive
中调用
NSCalendarDayChangedNotification
checkDayChange
系统观察者:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(reloadData) name:NSCalendarDayChangedNotification object:nil];
https://developer.apple.com/documentation/foundation/nscalendardaychangednotification?language=objc