美文网首页
Swift 0点时间管理

Swift 0点时间管理

作者: 四月_Hsu | 来源:发表于2018-04-24 18:40 被阅读37次

    场景

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

    实现代码

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

    
    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点时间管理

          本文链接:https://www.haomeiwen.com/subject/cczjlftx.html