Делать что-то каждые x минут в Swift



Как я могу запускать функцию каждую минуту?
В JavaScript я могу сделать что-то вроде setInterval, есть ли что-то подобное в Swift?



хотел выход:



Привет Мир раз в минуту...

584   6  

6 ответов:

var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)

func sayHello() 
{
    NSLog("hello World")
}

Не забудьте импортировать Фонда.

Swift 4:

 var helloWorldTimer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(ViewController.sayHello), userInfo: nil, repeats: true)

 @objc func sayHello() 
 {
     NSLog("hello World")
 }

в Swift 3, Вы можете создать Timer. И если вы нацелены на iOS версии 10 и выше, вы можете использовать блок-версию, которая упрощает потенциальные сильные опорные циклы, например:

weak var timer: Timer?

func startTimer() {
    timer?.invalidate()   // just in case you had existing `Timer`, `invalidate` it before we lose our reference to it
    timer = Timer.scheduledTimer(withTimeInterval: 60.0, repeats: true) { [weak self] _ in
        // do something here
    }
}

func stopTimer() {
    timer?.invalidate()
}

// if appropriate, make sure to stop your timer in `deinit`

deinit {
    stopTimer()
}

в Swift 2, вы создаете NSTimer. И если вы используете Swift 2, вы вполне можете использовать версию iOS до 10.0, и в этом случае вам нужно использовать более старую target/selector шаблон:

weak var timer: NSTimer?

func startTimer() {
    timer?.invalidate()   // just in case you had existing `NSTimer`, `invalidate` it before we lose our reference to it
    timer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: #selector(handleTimer(_:)), userInfo: nil, repeats: true)
}

func handleTimer(timer: NSTimer) {
    // do something here
}

func stopTimer() {
    timer?.invalidate()
}

// because this old target/selector approach will keep a strong reference
// to the `target`, if you want the timer to stop when the view controller
// is dismissed, you can't stop the timer in `deinit`, but rather have to 
// detect the dismissing of the view controller using other mechanisms. Commonly,
// we used to detect the view disappearing, like below:

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    stopTimer()
}

пока NSTimer как правило, лучше всего, ради полнота, я должен отметить, что вы также можете использовать таймер отправки, который полезен для планирования таймеров на фоновых потоках. С помощью диспетчерских таймеров, поскольку они основаны на блоках, он позволяет избежать некоторых сильных проблем с циклом ссылок со старым target/selector модель NSTimer, пока вы используете weak ссылки.

Итак, в Swift 3:

var timer: DispatchSourceTimer?

func startTimer() {
    let queue = DispatchQueue(label: "com.domain.app.timer")  // you can also use `DispatchQueue.main`, if you want
    timer = DispatchSource.makeTimerSource(queue: queue)
    timer!.scheduleRepeating(deadline: .now(), interval: .seconds(60))
    timer!.setEventHandler { [weak self] in
        // do whatever you want here
    }
    timer!.resume()
}

func stopTimer() {
    timer?.cancel()
    timer = nil
}

deinit {
    self.stopTimer()
}

В Swift 2:

var timer: dispatch_source_t?

func startTimer() {
    let queue = dispatch_queue_create("com.domain.app.timer", nil) // again, you can use `dispatch_get_main_queue()` if you want to use the main queue
    timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
    dispatch_source_set_timer(timer!, DISPATCH_TIME_NOW, 60 * NSEC_PER_SEC, 1 * NSEC_PER_SEC) // every 60 seconds, with leeway of 1 second
    dispatch_source_set_event_handler(timer!) { [weak self] in
        // do whatever you want here
    }
    dispatch_resume(timer!)
}

func stopTimer() {
    if let timer = timer {
        dispatch_source_cancel(timer)
        self.timer = nil
    }
}

deinit {
    self.stopTimer()
}

для получения дополнительной информации см. the создание таймера раздел Отправка Исходных Примеров на Источники Отправка на Руководство По Программированию Параллелизма.

вот обновление NSTimer ответ, для Swift 3 (в котором NSTimer была переименована в Timer) используя замыкание, а не именованную функцию:

var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
    (_) in
    print("Hello world")
}

можно использовать NSTimer

var timer = NSTimer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)

в selector () вы вводите имя своей функции

в swift 3.0 GCD получил рефакторинг:

let timer : DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)

timer.scheduleRepeating(deadline: .now(), interval: .seconds(60))
timer.setEventHandler
{
    NSLog("Hello World")
}
timer.resume()

это особенно полезно, когда вам нужно отправить на определенной очереди. Также, если вы планируете использовать это для обновления пользовательского интерфейса, то CADisplayLink как это синхронизировано с частотой обновления GPU.

Если вы можете разрешить в течение некоторого времени дрейф вот простое решение, выполняющее какой-то код каждую минуту:

private func executeRepeatedly() {
    // put your code here

    DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
        self?.executeRepeatedly()
    }
}

просто запустить executeRepeatedly() один раз, и он будет выполняться каждую минуту. Выполнение останавливается, когда объект-владелец (self) освобождается. Вы также можете использовать флаг, чтобы указать, что выполнение должно быть остановлено.

Comments

    Ничего не найдено.