Відповіді:
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)
func sayHello()
{
NSLog("hello World")
}
Не забудьте імпортувати Foundation.
Швидкий 4:
var helloWorldTimer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(ViewController.sayHello), userInfo: nil, repeats: true)
@objc func sayHello()
{
NSLog("hello World")
}
NSTimer
зберігає свою ціль, тому при цьому налаштування, якщо helloWorldTimer
це властивість, у self
вас є цикл збереження, де self
зберігається helloWorldTimer
і helloWorldTimer
зберігається self
.
Якщо націлено на iOS версії 10 та новіших, ви можете використовувати блокове видання Timer
, яке спрощує потенційні потужні еталонні цикли, наприклад:
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()
}
Хоча, Timer
як правило, найкраще, для повноти слід зазначити, що ви також можете використовувати таймер диспетчеризації, який корисний для таймерів планування фонових ниток. Що стосується таймерів диспетчеризації, оскільки вони засновані на блоці, це дозволяє уникнути деяких сильних проблем еталонного циклу зі старим target
/ selector
шаблоном Timer
, якщо ви використовуєте weak
посилання.
Так:
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!.schedule(deadline: .now(), repeating: .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 див. Попередню редакцію цієї відповіді .
dispatch_after
. Або неповторювані NSTimer
.
Ось оновлення NSTimer
відповіді для Swift 3 (в якому NSTimer
було перейменовано на Timer
) із застосуванням закриття, а не названої функції:
var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
(_) in
print("Hello world")
}
Якщо ви можете дозволити деякий час дрейфу, ось просте рішення, виконуючи якийсь код щохвилини:
private func executeRepeatedly() {
// put your code here
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
self?.executeRepeatedly()
}
}
Просто запустіть executeRepeatedly()
один раз, і він буде виконуватися щохвилини. Виконання припиняється, коли self
звільняється об'єкт, що володіє ( ). Ви також можете використовувати прапор, щоб вказати, що виконання повинно припинятися.
Ви можете використовувати Timer
(швидкий 3)
var timer = Timer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)
У селекторі () ви вводите ім'я функції
Timer
... NSTimer
було перейменовано
У швидкому 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.