场景
有些时候,我们需要一些功能在每天零点时进行刷新。目前我遇到的是签到、任务功能需要在零点刷新。上篇文章中的雷达动画就是指任务、签到按钮默认有动画,点击后停止动画,零点后动画重新开始。
实现代码
创建一个时间管理类,完整代码如下:
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"
}
今天完成时也查了些资料,留下来,以备后用。
网友评论