Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS中,有一段代码等待在特定时间运行_Ios_Swift_Timer_Scheduled Tasks - Fatal编程技术网

在iOS中,有一段代码等待在特定时间运行

在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 } 注意:您的应用程序必须处于活动状态。 您还可

假设我有一个视图控制器,其中包含我希望在某个特定时间执行的代码,比如说下午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
}
注意:您的应用程序必须处于活动状态。
此外,您还可以查看

您可以计算出未来日期与现在之间的秒数,并使用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提供的附加功能,您可以计算当前时间和所需启动时间之间的差异。