在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定时器设置初始延迟?
答案 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
})