【问题标题】:Detecting Day Change in iOS App检测 iOS 应用程序中的日变化
【发布时间】:2017-04-12 18:50:08
【问题描述】:

所以我一直在研究如何在我的 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

}

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

【问题讨论】:

  • UIApplicationSignificantTimeChangeNotification 仅在您的应用程序运行时有用。但请注意,除了午夜更改日期之外的其他原因也可以调用它。
  • 我明白了,所以我最好的办法是创建当前日期的存储值,然后继续检查/覆盖它?
  • 是的。你需要这样做。

标签: ios objective-c nscalendar


【解决方案1】:

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

  • 致电checkDayChange 也可拨打applicationDidFinishLaunchingapplicationDidBecomeActive

【讨论】:

  • 啊,所以我所要做的就是在我的 AppDelegate.m 中观察 NSCalendarDayChangedNotification,然后 checkDayChange 方法将处理覆盖当前日期并重置值。如果用户杀死应用程序,通知不会变得无用吗?
  • 该通知仅在应用程序处于活动状态时才有用,否则始终在应用程序启动或变为活动状态时执行检查。
  • 所以即使用户在一天中的某个时间杀死了应用程序,也会在第二天执行检查并更新保存的日期并调用重置方法
  • @FaisalSyed 是的,没错。
  • 警告:NSCalendarDayChangedNotification 在后台线程中被调用。
【解决方案2】:

系统观察者:

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(reloadData) name:NSCalendarDayChangedNotification object:nil];

https://developer.apple.com/documentation/foundation/nscalendardaychangednotification?language=objc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多