直接看主要代码
//截止日期@H_403_7@
let@H_403_7@ endDate = datePicker.date
//开始日期@H_403_7@
let@H_403_7@ startDate = Date()
//时间间隔@H_403_7@
let@H_403_7@ timeInterval:TimeInterval = endDate.timeIntervalSince(startDate)
if@H_403_7@ timer == nil {
//剩余时间@H_403_7@
var timeout = timeInterval
if@H_403_7@ timeout != 0@H_403_7@ {
//创建全局队列@H_403_7@
let@H_403_7@ queue = DispatchQueue.global()
//在全局队列下创建一个时间源@H_403_7@
timer = DispatchSource.makeTimerSource(flags: [],queue: queue)
//设定循环的间隔是一秒,并且立即开始@H_403_7@
timer?.scheduleRepeating(wallDeadline: DispatchWallTime.now(),interval: .seconds(1@H_403_7@))
//时间源出发事件@H_403_7@
timer?.setEventHandler(handler: {
//必须是当前日期往后的日期,在datePicker上也做了限制@H_403_7@
if@H_403_7@ timeout <= 0@H_403_7@ {
self@H_403_7@.timer?.cancel()
self@H_403_7@.timer = nil
DispatchQueue.main.async(execute: {
self@H_403_7@.day.text = "00"@H_403_7@
self@H_403_7@.hour.text = "00"@H_403_7@
self@H_403_7@.minute.text = "00"@H_403_7@
self@H_403_7@.second.text = "00"@H_403_7@
})
} else@H_403_7@ {
//计算剩余时间@H_403_7@
let@H_403_7@ days = Int(timeout) / (3600@H_403_7@ * 24@H_403_7@)
if@H_403_7@ days == 0@H_403_7@ {
self@H_403_7@.day.text = ""@H_403_7@
}
let@H_403_7@ hours = (Int(timeout) - Int(days) * 24@H_403_7@ * 3600@H_403_7@) / 3600@H_403_7@
let@H_403_7@ minutes = (Int(timeout) - Int(days) * 24@H_403_7@ * 3600@H_403_7@ - Int(hours) * 3600@H_403_7@) / 60@H_403_7@
let@H_403_7@ seconds = Int(timeout) - Int(days) * 24@H_403_7@ * 3600@H_403_7@ - Int(hours) * 3600@H_403_7@ - Int(minutes) * 60@H_403_7@
//主队列中刷新UI@H_403_7@
DispatchQueue.main.async(execute: {
if@H_403_7@ days == 0@H_403_7@ {
self@H_403_7@.day.text = "0"@H_403_7@
} else@H_403_7@ {
self@H_403_7@.day.text = "\(days)"@H_403_7@
}
if@H_403_7@ hours < 10@H_403_7@ {
self@H_403_7@.hour.text = "0"@H_403_7@ + "\(hours)"@H_403_7@
} else@H_403_7@ {
self@H_403_7@.hour.text = "\(hours)"@H_403_7@
}
if@H_403_7@ minutes < 10@H_403_7@ {
self@H_403_7@.minute.text = "0"@H_403_7@ + "\(minutes)"@H_403_7@
} else@H_403_7@ {
self@H_403_7@.minute.text = "\(minutes)"@H_403_7@
}
if@H_403_7@ seconds < 10@H_403_7@ {
self@H_403_7@.second.text = "0"@H_403_7@ + "\(seconds)"@H_403_7@
} else@H_403_7@ {
self@H_403_7@.second.text = "\(seconds)"@H_403_7@
}
})
timeout -= 1@H_403_7@
}
})
//启动时间源@H_403_7@
timer?.resume()
}
}