iOS中如何从significantTimeChangeNotification获取变更前的时区
关于监听时区变更并获取变更前时区的方案
significantTimeChangeNotification本身不会直接携带变更前的时区信息,没法从通知的 payload 里直接拿到旧时区。不过可以用以下更优雅的方式替代数据库查询:
内存缓存旧时区:
在应用启动时,先把当前时区(比如TimeZone.current)存入内存缓存(可以用单例类、全局变量或者UserDefaults)。每次收到significantTimeChangeNotification时,缓存里的值就是变更前的旧时区,随后再将缓存更新为新的当前时区。这种方式不需要访问数据库,完全在内存中操作,效率更高也更简洁。举个Swift代码示例:
// 单例类负责缓存时区 class TimeZoneCache { static let shared = TimeZoneCache() private(set) var cachedTimeZone: TimeZone = .current func refresh() { cachedTimeZone = .current } } // 注册通知监听 NotificationCenter.default.addObserver(forName: UIApplication.significantTimeChangeNotification, object: nil, queue: .main) { _ in let oldZone = TimeZoneCache.shared.cachedTimeZone let newZone = TimeZone.current // 执行数据库记录逻辑 // saveToDatabase(oldTimeZone: oldZone, newTimeZone: newZone) // 更新缓存 TimeZoneCache.shared.refresh() }注意事项:如果应用被后台杀死重启,缓存会重置为当前时区,这时候如果需要追溯上次的时区变更记录,还是得从数据库取最后一条,但日常运行时的变更都可以通过缓存直接获取旧值,兼顾了优雅和可靠性。
内容的提问来源于stack exchange,提问作者Mano
相关产品推荐
相关产品推荐

