在iOS中,有一段代码等待在特定时间运行
假设我有一个视图控制器,其中包含我希望在某个特定时间执行的代码,比如说下午2:00。我想发生的是,如果用户在下午1:58打开视图控制器,代码将等待并持续检查时间,在下午2:00执行。在Swift 4中有没有一种方法可以做到这一点,也许可以使用计时器?阅读 例如:在iOS中,有一段代码等待在特定时间运行,ios,swift,timer,scheduled-tasks,Ios,Swift,Timer,Scheduled Tasks,假设我有一个视图控制器,其中包含我希望在某个特定时间执行的代码,比如说下午2:00。我想发生的是,如果用户在下午1:58打开视图控制器,代码将等待并持续检查时间,在下午2:00执行。在Swift 4中有没有一种方法可以做到这一点,也许可以使用计时器?阅读 例如: // Delay 2 seconds DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // your code } 注意:您的应用程序必须处于活动状态。 您还可
// Delay 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
// your code
}
注意:您的应用程序必须处于活动状态。
您还可以查看了解
例如:
// Delay 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
// your code
}
注意:您的应用程序必须处于活动状态。
此外,您还可以查看您可以计算出未来日期与现在之间的秒数,并使用GCD或计时器设置未来事件:
let futureDate = ISO8601DateFormatter().date(from: "2018-1-1T00:00:00Z" )!
DispatchQueue.main.asyncAfter(deadline: .now() + futureDate.timeIntervalSinceNow) {
print("Its the future!")
}
或
计时器更容易取消和重新安排:
timer.invalidate()
您可以计算未来日期和现在之间的秒数,并使用GCD或计时器设置未来事件:
let futureDate = ISO8601DateFormatter().date(from: "2018-1-1T00:00:00Z" )!
DispatchQueue.main.asyncAfter(deadline: .now() + futureDate.timeIntervalSinceNow) {
print("Its the future!")
}
或
计时器更容易取消和重新安排:
timer.invalidate()
您可以向runloop中添加带有启动日期的计时器:
{
let dateOfExecution = Date(timeIntervalSince1970: <number of seconds from 1970-01-01-00:00:00 to your date of execution>)
let timer = Timer(fireAt: dateOfExecution, interval: 0, target: self, selector: #selector(codeToExecute), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
}
@objc func codeToExecute() {
<Your code to run>
}
{
执行日期=日期(时间间隔自1970年起:)
设timer=timer(fireAt:dateOfExecution,间隔:0,目标:self,选择器:#选择器(codeToExecute),userInfo:nil,repeats:false)
RunLoop.main.add(计时器,forMode:RunLoopMode.commonModes)
}
@objc func codeToExecute(){
}
请参阅Apple文档:您可以在runloop中添加一个带有启动日期的计时器:
{
let dateOfExecution = Date(timeIntervalSince1970: <number of seconds from 1970-01-01-00:00:00 to your date of execution>)
let timer = Timer(fireAt: dateOfExecution, interval: 0, target: self, selector: #selector(codeToExecute), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
}
@objc func codeToExecute() {
<Your code to run>
}
{
执行日期=日期(时间间隔自1970年起:)
设timer=timer(fireAt:dateOfExecution,间隔:0,目标:self,选择器:#选择器(codeToExecute),userInfo:nil,repeats:false)
RunLoop.main.add(计时器,forMode:RunLoopMode.commonModes)
}
@objc func codeToExecute(){
}
请参阅苹果文档:您可以通过以下方法获得结果:
override func viewDidLoad() {
super.viewDidLoad()
let dateFormatter = DateFormatter()
/*The accepted DateFormat*/
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
/*My Date String to run the code at*/
let dateString = "12-06-2017 15:41"
let date = dateFormatter.date(from: dateString)
/*Now find the time differnce from now*/
let secondsFromNowToFinish = date?.timeIntervalSinceNow
DispatchQueue.main.asyncAfter(deadline: .now() + secondsFromNowToFinish!, execute: {
print ("Hello Future.")
})
}
测试和运行
参考资料:
快乐编码。希望能有帮助。请移除强制展开的包装 您可以通过这种方式实现以下结果:
override func viewDidLoad() {
super.viewDidLoad()
let dateFormatter = DateFormatter()
/*The accepted DateFormat*/
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
/*My Date String to run the code at*/
let dateString = "12-06-2017 15:41"
let date = dateFormatter.date(from: dateString)
/*Now find the time differnce from now*/
let secondsFromNowToFinish = date?.timeIntervalSinceNow
DispatchQueue.main.asyncAfter(deadline: .now() + secondsFromNowToFinish!, execute: {
print ("Hello Future.")
})
}
测试和运行
参考资料:
快乐编码。希望能有帮助。请移除强制展开的包装 这个答案是没有用的,因为它没有解决让应用程序在特定时间运行的问题,比如说下午2点。调度队列只是增加了一个延迟。在要求的时间启动它需要@Nicolas Buquet提供的附加功能,您可以计算当前时间和所需启动时间之间的差异。这个答案没有用,因为它没有解决在特定时间(比如下午2点)运行应用的问题。调度队列只是增加了一个延迟。在要求的时间启动它需要@Nicolas Buquet提供的附加功能,您可以计算当前时间和所需启动时间之间的差异。