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")
}
NSTimer
mempertahankan targetnya, jadi, dengan penyiapan ini, jika helloWorldTimer
properti di self
Anda memiliki siklus penahan, di mana self
mempertahankan helloWorldTimer
dan helloWorldTimer
mempertahankan 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 Timer
umumnya 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.selector
Timer
weak
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 NSTimer
jawabannya, untuk Swift 3 (yang NSTimer
namanya 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
... NSTimer
telah 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 CADisplayLink
karena disinkronkan dengan kecepatan refresh GPU.