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点时间管理的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Swift 的单数返回表达式中使用闭包简写变量必须详尽无遗?