Jawaban:
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)
func sayHello()
{
NSLog("hello World")
}
Ingatlah untuk mengimpor Foundation.
Cepat 4:
var helloWorldTimer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(ViewController.sayHello), userInfo: nil, repeats: true)
@objc func sayHello()
{
NSLog("hello World")
}
NSTimermempertahankan targetnya, jadi, dengan penyiapan ini, jika helloWorldTimerproperti di selfAnda memiliki siklus penahan, di mana selfmempertahankan helloWorldTimerdan helloWorldTimermempertahankan self.
Jika menargetkan iOS versi 10 dan yang lebih baru, Anda dapat menggunakan rendisi berbasis blok Timer, yang menyederhanakan potensi siklus referensi yang kuat, misalnya:
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()
}
Meskipun Timerumumnya yang terbaik, demi kelengkapan, saya harus mencatat bahwa Anda juga dapat menggunakan pengatur waktu pengiriman, yang berguna untuk menjadwalkan pengatur waktu pada utas latar belakang. Dengan pengatur waktu pengiriman, karena berbasis blok, ini menghindari beberapa tantangan siklus referensi yang kuat dengan pola target/ lama , selama Anda menggunakan referensi.selectorTimerweak
Begitu:
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()
}
Untuk informasi lebih lanjut, lihat bagian Membuat Timer dari Contoh Sumber Pengiriman di bagian Sumber Pengiriman dari Panduan Pemrograman Konkurensi.
Untuk Swift 2, lihat revisi sebelumnya dari jawaban ini .
dispatch_after. Atau tidak berulang NSTimer.
Berikut pembaruan untuk NSTimerjawabannya, untuk Swift 3 (yang NSTimernamanya diganti menjadi Timer) menggunakan closure daripada fungsi bernama:
var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
(_) in
print("Hello world")
}
Jika Anda dapat membiarkan beberapa waktu melayang, berikut adalah solusi sederhana yang mengeksekusi beberapa kode setiap menit:
private func executeRepeatedly() {
// put your code here
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
self?.executeRepeatedly()
}
}
Jalankan saja executeRepeatedly()sekali dan akan dijalankan setiap menit. Eksekusi berhenti ketika objek pemilik ( self) dilepaskan. Anda juga dapat menggunakan tanda untuk menunjukkan bahwa eksekusi harus dihentikan.
Anda dapat menggunakan Timer(swift 3)
var timer = Timer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)
Di selector () Anda memasukkan nama fungsi Anda
Timer... NSTimertelah diganti namanya
Di 3.0 cepat, GCD difaktor ulang:
let timer : DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: .now(), interval: .seconds(60))
timer.setEventHandler
{
NSLog("Hello World")
}
timer.resume()
Ini sangat berguna ketika Anda perlu mengirim pada Antrian tertentu. Juga, jika Anda berencana menggunakan ini untuk pembaruan antarmuka pengguna, saya sarankan untuk melihat CADisplayLinkkarena disinkronkan dengan kecepatan refresh GPU.