在我们的应用程序中,我们使用NSCalendar来处理NSDate对象,例如获取日期组件。
这个NSCalendar实例是一个单例对象,因为我们在很短的时间内完成了大量的日期计算,我们注意到每次需要时用[[NSCalendar alloc] initWith ...]创建新实例都耗费太多时间。
问题是,如果在整个应用程序执行期间保留NSCalendar实例,则此实例会保持timezone属性不变,即使时区已更改。
所以,问题在于我们想要检测时区的变化并通过以下两种方式正确反应:
self.singletonCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
或
self.singletonCalendar.timezone = [NSTimezone localTimezone];
我们正在讨论的可能解决方案:
谢谢, 尼古拉斯。
Putz1103实施了提议的解决方案:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(significantTimeChangeNotification) name:UIApplicationSignificantTimeChangeNotification object:nil];
- (void)significantTimeChangeNotification
{
NSTimeZone *localTimezone = [NSTimeZone localTimeZone];
[KIDateUtils setCalendarTimezone:localTimezone];
}
答案 0 :(得分:2)
我会做两个选项的混搭。我会在app start(或进入前台)上更新它。但是,当应用程序当前处于前台时,您可以设置一个监听器来进行时间更改,例如answer here:
"UIApplicationDelegate" has a method called "applicationSignificantTimeChange:" that gets called when there is a significant change in the time.
答案 1 :(得分:2)
让您的单身人士注册UIApplicationSignificantTimeChangeNotification
通知。收到此消息后,请更新单例中的NSCalendar
实例。