如何安排具有初始延迟的计时器?

时间:2018-12-26 07:30:36

标签: java swift timer

在Java中,我们可以创建一个具有初始延迟的定期执行程序,该延迟是延迟首次执行的时间。这是一个示例:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(new Fetcher(), 2, 10, TimeUnit.MINUTES);

class Fetcher implements Runnable {

    @Override
    public void run() {
        try {
              ...
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

例如,此可运行程序在开始计划的两分钟后起作用。然后,它每十分钟定期工作一次。

在Swift中,我们可以安排如下计时器:

Timer.scheduledTimer(timeInterval: 120, target: self, selector: #selector(fetch(_:)), userInfo: nil, repeats: true)

@objc fileprivate func fetch(_ timer: Timer!) {
    ...
}

但是,如何为swift定时器设置初始延迟?

4 个答案:

答案 0 :(得分:2)

在初始化程序中,您需要Timer和参数fireAt。当您要触发计时器时,fireAt通过Date

let initialDelayInSeconds = 5
let now = Date()
let date = Calendar.current.date(bySettingHour: Calendar.current.component(.hour, from: now), minute: Calendar.current.component(.minute, from: now), second: Calendar.current.component(.second, from: now) + initialDelayInSeconds, of: now)!

let timer = Timer(fireAt: date, interval: 120, target: self, selector: #selector(fetch(_:)), userInfo: nil, repeats: true)
RunLoop.main.add(timer, forMode: .common) // don't forget to add `timer` to `RunLoop`

答案 1 :(得分:0)

$> kill -9 $(cat pid.txt)

答案 2 :(得分:0)

您可以按以下方式使用Timer

Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { _ in
    Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.fetch(_:)), userInfo: nil, repeats: true)
}

DispatchQueue

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.fetch(_:)), userInfo: nil, repeats: true)
}

答案 3 :(得分:0)

在大多数情况下,使用dispatch_after块比使用sleep(time)更好,因为执行睡眠的线程被阻止执行其他工作。使用dispatch_after时,正在处理的线程不会被阻塞,因此它可以同时执行其他工作。 如果您正在处理应用程序的主线程,则使用sleep(time)不利于应用程序的用户体验,因为在此期间UI没有响应。

在调度代码块的执行而不是冻结线程之后调度:

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {

        // Put your code which should be executed with a delay here

    })