Swift 0点时间管理

场景

有些时候,我们需要一些功能在每天零点时进行刷新。目前我遇到的是签到、任务功能需要在零点刷新。上篇文章中的雷达动画就是指任务、签到按钮默认有动画,点击后停止动画,零点后动画重新开始。

实现代码

创建一个时间管理类,完整代码如下:


import UIKit

class ZeroDateManager: NSObject {
    
    /// 单例
    static let share = ZeroDateManager()
    private override init() {
        super.init()
    }
    
    /// 更新零点相关的状态
    func updateZeroWorkStatus() {
        if needReset() {
            // 任务按钮动画
            mUserDefaultsSetValue(false, UserDefaultsKey.clickedTaskButton)
            // 签到按钮动画
            mUserDefaultsSetValue(false, UserDefaultsKey.clickedSignButton)
        }
    }
    
    /// 是否需要重置一些信息
    ///
    /// - Returns: bool
    private func needReset() -> Bool {
        let calendar = NSCalendar.current
        // 当前时间
        let now = Date()
        let componts = calendar.dateComponents([.year, .month, .day], from: now)
        
        // 当天起点 - 测试时对比当前时间
       //  let startDate = calendar.date(from: componts) ?? Date()
        // 当天终点
        let endDate = calendar.date(byAdding: .day, value: 1, to: startDate) ?? Date()
        
        // 本地是否有记录时间
        if mUserDefaultsObject(UserDefaultsKey.lastOpenDateDayMaxDate) == nil {
            // 首次打开
            mUserDefaultsSetValue(endDate.timeIntervalSince1970, UserDefaultsKey.lastOpenDateDayMaxDate)
            return true
        } else {
            // 本地有记录时间,则对比
            let lastDate = mUserDefaultsObject(UserDefaultsKey.lastOpenDateDayMaxDate) as! TimeInterval
            if now.timeIntervalSince1970 >= lastDate {
                // 当前时间比记录值大,则更新时间
                mUserDefaultsSetValue(now.timeIntervalSince1970, UserDefaultsKey.lastOpenDateDayMaxDate)
                return true
            } else {
                return false
            }
        }
    }
}

其中, mUserDefaultsSetValue 是方法简写:

public func mUserDefaultsObject(_ key: String) -> Any? {
    return UserDefaults.standard.object(forKey: key)
}

UserDefaultsKey 是项目中需要存储在项目中的一些常用值的标识字符串:

// MARK: - 暂时存储在 UserDefault 里面的一些数据源
struct UserDefaultsKey {
    // 判断用户是否点击过签到
    static let clickedSignButton = "clickedSignButton"
    // 判断用户是否点击过任务
    static let clickedTaskButton = "clickedTaskButton"
    // 判断上一次打开APP的时间的 23:59:59 ,刷新部分需要凌晨更改状态的任务
    static let lastOpenDateDayMaxDate = "lastOpenDateDayMaxDatelastOpenDateDayMaxDate"
}

今天完成时也查了些资料,留下来,以备后用。

你可能感兴趣的:(Swift 0点时间管理)