Swift 0点时间管理

Posted 人散风中

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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点时间管理的主要内容,如果未能解决你的问题,请参考以下文章

绘制圆线iOS Swift

为啥在 Swift 的单数返回表达式中使用闭包简写变量必须详尽无遗?

简写的闭包数组:Xcode Swift:表达式太复杂,无法在合理的时间内解决

Swift 0点时间管理

Swift 0点时间管理

[IOI2018]werewolf狼人——kruskal重构树+可持久化线段树