iOS应用中日期变更及唤醒时更新CalendarManager变量的方案求助
解决方案:CalendarManager 后台唤醒后日期更新问题
1. 给CalendarManager添加日期更新方法
先把初始化里的日期赋值逻辑抽成独立方法,这样不管是初始化还是后续需要更新时,都能复用逻辑:
/// This class will contain all the methods used to fetch data (next event, last event of day etc) from user's calendar class CalendarManager { public var weekdayNb: Int public var weekday: String public var day: String public var monthNb: Int public var month: String public var year: String private let weekDays = [ "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" ] private let months = [ "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" ] init() { // 先初始化默认值,再调用更新方法 self.weekdayNb = 0 self.weekday = "" self.day = "" self.monthNb = 0 self.month = "" self.year = "" updateDate() } // 新增日期更新方法 public func updateDate() { let date = Date() self.weekdayNb = Calendar.current.component(.weekday, from: date) - 1 self.weekday = weekDays[weekdayNb] self.day = String(Calendar.current.component(.day, from: date)) self.monthNb = Calendar.current.component(.month, from: date) self.month = months[monthNb - 1] self.year = String(Calendar.current.component(.year, from: date)) } }
2. 监听应用回到前台的事件
方式一:用NotificationCenter监听前台通知
在你持有CalendarManager实例的地方(比如AppDelegate)注册通知,触发更新:
// 假设这是全局的CalendarManager实例 let calendarManager = CalendarManager() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 注册应用即将进入前台的通知 NotificationCenter.default.addObserver(self, selector: #selector(refreshCalendarData), name: UIApplication.willEnterForegroundNotification, object: nil) return true } @objc private func refreshCalendarData() { calendarManager.updateDate() // 这里可以同步刷新UI或其他依赖日期的逻辑 }
方式二:用SceneDelegate适配多场景(iOS13+)
如果你的应用使用SceneDelegate,直接在场景即将进入前台的回调里调用更新:
class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? let calendarManager = CalendarManager() func sceneWillEnterForeground(_ scene: UIScene) { calendarManager.updateDate() } }
3. 更简洁的优化方案:改用计算属性
直接把日期相关属性改成计算属性,每次访问时实时获取当前日期,从根源避免过期数据问题,不需要额外监听或手动更新:
/// This class will contain all the methods used to fetch data (next event, last event of day etc) from user's calendar class CalendarManager { private let weekDays = [ "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" ] private let months = [ "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" ] // 计算属性实时获取当前日期组件 public var weekdayNb: Int { Calendar.current.component(.weekday, from: Date()) - 1 } public var weekday: String { weekDays[weekdayNb] } public var day: String { String(Calendar.current.component(.day, from: Date())) } public var monthNb: Int { Calendar.current.component(.month, from: Date()) } public var month: String { months[monthNb - 1] } public var year: String { String(Calendar.current.component(.year, from: Date())) } }
内容的提问来源于stack exchange,提问作者M3tex
相关产品推荐
相关产品推荐

