ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Swift5.2 Control CountDownManager(时间计时器)

Swift5.2 Control CountDownManager(时间计时器) 一直觉得自己写的不是技术而是情怀一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的希望我的这条路能让你们少走弯路希望我能帮你们抹去知识的蒙尘希望我能帮你们理清知识的脉络希望未来技术之巅上有你们也有我。Swift-CountDownManager(时间计时器)代码下载使用场景当时写项目的时候用户进入确认订单后退出变成待支付计算用户未付款的时候超过时间后取消订单。效果展示代码使用代码importUIKitimportSnapKitclassViewController:UIViewController{privateletcountDownManagerCountDownManager()privatelettimeLabelUILabel()overridefuncviewDidLoad(){super.viewDidLoad()view.backgroundColor.whitesetupUI()startClockwiseTimer()}privatefuncsetupUI(){timeLabel.textAlignment.center timeLabel.fontUIFont.systemFont(ofSize:16,weight:.medium)timeLabel.textColor.black view.addSubview(timeLabel)timeLabel.snp.makeConstraints{makeinmake.center.equalToSuperview()}}privatefuncstartClockwiseTimer(){// 假设开始时间是 2026-08-18 10:00:00 的时间戳毫秒letstartTimestamp:Int641_720_000_000_000// 示例值请替换为实际值// 时间校准如果需要与服务器时间同步传入偏差值否则传 0letadjust:TimeInterval0countDownManager.clockwiseHasPasstimeWithStratTimeStamp(startTimestamp,adjust:adjust){[weakself]timeStringinself?.timeLabel.text已过时间\(timeString)}}}封装代码importFoundation class CountDownManager{private var timer: DispatchSourceTimer? privateletdateFormatter: DateFormatter{letformatterDateFormatter()formatter.dateFormatYYYY-MM-dd HH:mm:ssformatter.timeZoneTimeZone.currentreturnformatter}()deinit{destoryTimer()print(\(Self.self) deinit)}// MARK: - Public Methods /// 顺计时 /// - Parameters: /// - starTimeStamp: 开始时间戳(毫秒)/// - adjust: 时间校准值(秒)/// - completeBlock: 回调(已过时间字符串)func clockwiseHasPasstimeWithStratTimeStamp(_ starTimeStamp: Int64, adjust: TimeInterval, completeBlock: escaping(String)-Void){destoryTimer()letnowIntervalDate().timeIntervalSince1970 adjustletpassIntervalnowInterval - TimeInterval(starTimeStamp)/1000vartimeoutInt(passInterval)timerDispatchSource.makeTimerSource(queue: DispatchQueue.global())timer?.schedule(deadline: .now(), repeating:1.0)timer?.setEventHandler{[weak self]intimeout1lethourstimeout/(60*60)letminutes(timeout %(60*60))/60letsecondstimeout%60DispatchQueue.main.async{completeBlock(self?.refreshUI(hour: hours, minute: minutes, second: seconds)??)}}timer?.resume()}/// 计算已过时间 /// - Parameters: /// - starTimeStamp: 开始时间戳(毫秒)/// - finishTimeStamp: 结束时间戳(毫秒)/// - adjust: 时间校准值(秒)/// - completeBlock: 回调(已过时间字符串, 是否结束)func countDownHasPasstimeWithStratTimeStamp(_ starTimeStamp: Int64, finishTimeStamp: Int64, adjust: TimeInterval, completeBlock: escaping(String, Bool)-Void){destoryTimer()letnowIntervalDate().timeIntervalSince1970 adjustletpassIntervalnowInterval - TimeInterval(starTimeStamp)/1000letfinishIntervalTimeInterval(finishTimeStamp - starTimeStamp)/1000vartimeoutInt(passInterval)iftimeoutInt(finishInterval){timerDispatchSource.makeTimerSource(queue: DispatchQueue.global())timer?.schedule(deadline: .now(), repeating:1.0)timer?.setEventHandler{[weak self]invar isFinishfalseiftimeoutInt(finishInterval){self?.destoryTimer()isFinishtrue}else{timeout1}lethourstimeout/(60*60)letminutes(timeout %(60*60))/60letsecondstimeout%60DispatchQueue.main.async{completeBlock(self?.refreshUI(hour: hours, minute: minutes, second: seconds)??, isFinish)}}timer?.resume()}}/// 根据结束时间倒计时 /// - Parameters: /// - finishTimeStamp: 结束时间戳(毫秒)/// - adjust: 时间校准值(秒)/// - completeBlock: 回调(剩余时间字符串, 是否结束)func countDownWithFinishTimeStamp(_ finishTimeStamp: Int64, adjust: TimeInterval, completeBlock: escaping(String, Bool)-Void){letnowIntervalDate().timeIntervalSince1970 adjustletlastTimeIntervalTimeInterval(finishTimeStamp)/1000- nowInterval countDownWithTimeout(lastTimeInterval, completeBlock: completeBlock)}// MARK: - Private Methods private func countDownWithTimeout(_ timeOut: TimeInterval, completeBlock: escaping(String, Bool)-Void){destoryTimer()vartimeoutInt(timeOut)iftimeout0{timerDispatchSource.makeTimerSource(queue: DispatchQueue.global())timer?.schedule(deadline: .now(), repeating:1.0)timer?.setEventHandler{[weak self]iniftimeout0{self?.destoryTimer()DispatchQueue.main.async{completeBlock(self?.refreshUI(hour:0, minute:0, second:0)??,true)}}else{lethourstimeout/(60*60)letminutes(timeout %(60*60))/60letsecondstimeout%60DispatchQueue.main.async{completeBlock(self?.refreshUI(hour: hours, minute: minutes, second: seconds)??,false)}timeout-1}}timer?.resume()}else{completeBlock(refreshUI(hour:0, minute:0, second:0),true)}}private func refreshUI(hour: Int, minute: Int, second: Int)-String{var timeStrifhour0{timeStrString(format:%02d小时, hour)}timeStrString(format:%02d分钟, minute)timeStrString(format:%02d秒, second)returntimeStr}private func getNowyyyymmdd()-String{letnowDate()letformatDayDateFormatter()formatDay.dateFormatyyyy-MM-ddreturnformatDay.string(from: now)}/// 销毁定时器 funcdestoryTimer(){timer?.cancel()timernil}}
返回列表