ios - 检测 iOS 应用程序中的日期变化

标签 ios objective-c nscalendar

所以我一直在研究如何在我的 iOS 应用程序中判断今天是否是新的一天。基本上,我想在新的一天开始后立即将一堆值重置为 0。我已经看到我可以使用在午夜发送通知的“UIApplicationSignificantTimeChangeNotification”。但是,如果用户在上午 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"];
       }
    }
    
  • 使用选择器checkDayChange

    观察NSCalendarDayChangedNotification
  • 也在 applicationDidFinishLaunchingapplicationDidBecomeActive 中调用 checkDayChange

关于ios - 检测 iOS 应用程序中的日期变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43377417/

相关文章:

iOS 代码签名仅对 Jenkins 失败

ios - 在没有 CATransaction begin&commit 的情况下禁用隐式动画

iphone - 有没有办法立即将自定义外观应用于整个应用程序?

ios - 脚本动画 block iOS

objective-c - 如何将 Swift 代码导入 Objective-C?

iOS:UIVIew 在 segue 和 popViewController 之后回到起始位置

ios - 在线文档中未包含 NSCalendar 的某些方法。这些可以安全使用吗?

ios - 如何获取相对于 GMT 以外时区的 NSCalendarComponent 值?

ios - 为什么 NSCalendar 有两个具有相似参数类型的 init 方法,它们接受日历标识符常量之一?

iphone - 在应用程序不运行期间,如何增加applicationIconBadgeNumber的值?