Как запланировать таймер с начальной задержкой? - PullRequest
0 голосов
/ 26 декабря 2018

В 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!) {
    ...
}

Но как мы можем установить начальную задержку для быстрого таймера?

Ответы [ 4 ]

0 голосов
/ 26 декабря 2018

Использование блока dispatch_after в большинстве случаев лучше, чем использование sleep(time), поскольку поток, в котором выполняется спящий режим, заблокирован от выполнения другой работы.при использовании dispatch_after обрабатываемый поток не блокируется, поэтому он может выполнять другую работу в это время.Если вы работаете в главном потоке своего приложения, использование sleep (time) плохо влияет на работу вашего приложения, поскольку пользовательский интерфейс не отвечает в течение этого времени.

Отправка после планирования выполнения блокакод вместо замораживания потока:

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

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

    })
0 голосов
/ 26 декабря 2018
DispatchQueue.main.asyncAfter(deadline: .now() + 120, execute: {
       Timer.scheduledTimer(timeInterval:600, target: self, selector: #selector(fetch(_:)), userInfo: nil, repeats: true)
})

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

}
0 голосов
/ 26 декабря 2018

Либо вы можете использовать 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)
}
0 голосов
/ 26 декабря 2018

Вам нужно 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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...