Ios 检测[NSTimeZone localTimezone]秒自GMT属性更改

Ios 检测[NSTimeZone localTimezone]秒自GMT属性更改,ios,nscalendar,nstimezone,Ios,Nscalendar,Nstimezone,在我们的应用程序中,我们使用NSCalendar处理NSDate对象,例如获取day组件 此NSCalendar实例是一个单例对象,因为我们在很短的时间内进行了大量的日期计算,并且我们注意到每次需要时使用[[NSCalendar alloc]initWith…]创建新实例都会耗费太多时间 问题是,如果在整个应用程序执行期间保留NSCalendar实例,则即使时区发生更改,该实例也会保持时区属性不变 因此,问题在于我们想要检测时区的变化,并通过以下方式做出正确反应: self.singletonC

在我们的应用程序中,我们使用NSCalendar处理NSDate对象,例如获取day组件

此NSCalendar实例是一个单例对象,因为我们在很短的时间内进行了大量的日期计算,并且我们注意到每次需要时使用[[NSCalendar alloc]initWith…]创建新实例都会耗费太多时间

问题是,如果在整个应用程序执行期间保留NSCalendar实例,则即使时区发生更改,该实例也会保持时区属性不变

因此,问题在于我们想要检测时区的变化,并通过以下方式做出正确反应:

self.singletonCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]


我们正在讨论的可能解决方案:

  • 每次应用程序激活时更新时区属性
  • 使用KVO检测时区更改(尝试此操作未成功)
  • 谢谢, 尼古拉斯


    Putz1103实施的拟议解决方案:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(significantTimeChangeNotification) name:UIApplicationSignificantTimeChangeNotification object:nil];
    
    - (void)significantTimeChangeNotification
    {
        NSTimeZone *localTimezone = [NSTimeZone localTimeZone];
        [KIDateUtils setCalendarTimezone:localTimezone];
    }
    

    我会将两个选项混搭在一起。我会在应用程序启动时更新它(或进入前台)。但是,当应用程序当前处于前台时,您可以为时间更改设置侦听器,如:


    “UIApplicationLegate”有一个名为“ApplicationsSignificantTimeChange:”的方法,当时间发生重大变化时会调用该方法。

    我将对两个选项进行混搭。我会在应用程序启动时更新它(或进入前台)。但是,当应用程序当前处于前台时,您可以为时间更改设置侦听器,如:


    “UIApplicationLegate”有一个名为“ApplicationsSignificantTimeChange:”的方法,当时间发生重大变化时会调用该方法。

    UIApplicationsSignificantTimeChangeNotification
    通知进行单例注册。收到此信息后,更新singleton中的
    NSCalendar
    实例。

    UIApplicationsSignificantTimeChangeNotification
    通知注册singleton。收到此信息后,更新singleton中的
    NSCalendar
    实例。

    在更新中,您发布了一个建议的解决方案,该解决方案记入Putz1103,但这是rmaddy给出的答案。Putz1103建议使用
    UIApplicationTondelegate
    方法
    ApplicationsSignificantTimeChange:
    。在您的更新中,您发布了一个建议的解决方案,该解决方案归功于Putz1103,但这是rmaddy给出的答案。Putz1103建议使用
    UIApplicationEndelegate
    方法
    应用程序重要时间更改:
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(significantTimeChangeNotification) name:UIApplicationSignificantTimeChangeNotification object:nil];
    
    - (void)significantTimeChangeNotification
    {
        NSTimeZone *localTimezone = [NSTimeZone localTimeZone];
        [KIDateUtils setCalendarTimezone:localTimezone];
    }