Відповіді:
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.