让代码块等待在iOS中的某个特定时间运行

时间:2017-12-06 07:33:29

标签: ios swift timer scheduled-tasks

假设我有一个视图控制器,我想在某个时间执行代码,比如说下午2:00。我想要发生的是,如果用户在下午1:58打开视图控制器,代码将等待并持续检查时间,正好在下午2:00执行。有没有办法在Swift 4中执行此操作,可能还有计时器?

4 个答案:

答案 0 :(得分:1)

您可以计算出未来日期与现在之间的秒数,并使用GCD或计时器设置未来事件:

let futureDate = ISO8601DateFormatter().date(from: "2018-1-1T00:00:00Z" )!
DispatchQueue.main.asyncAfter(deadline: .now() + futureDate.timeIntervalSinceNow) {
    print("Its the future!")
}

let futureDate = ISO8601DateFormatter().date(from: "2018-1-1T00:00:00Z" )!
let timer = Timer.scheduledTimer(withTimeInterval: futureDate.timeIntervalSinceNow, repeats: false) {
    print("Its the future!")
}

计时器更容易取消和重新安排:

timer.invalidate()

答案 1 :(得分:1)

您可以向runloop添加带有开火日期的计时器:

lists[i]

请参阅Apple文档:https://developer.apple.com/documentation/foundation/timer/1415700-init

答案 2 :(得分:1)

您可以通过这种方式来实现结果:

 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.")
        })


    }

经过测试和运行。 enter image description here

参考文献:

DateFormatter

Convert Date String to Date

快乐的编码。希望能帮助到你。请删除强制解包。

答案 3 :(得分:-1)

了解DispatchQueue

示例:

// Delay 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
     // your code
}

注意:您的申请必须是有效的。 您也可以查看Background modes tutorial

相关问题