You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:24:15