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