Yanıtlar:
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)
func sayHello()
{
NSLog("hello World")
}
Foundation'ı ithal etmeyi unutmayın.
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")
}
NSTimer
hedefini koruyor, bu yüzden, bu kurulumla, eğer helloWorldTimer
bir özellik varsa , self
kendinize bir tutma döngüsüne sahip olursunuz, burada self
tutulan helloWorldTimer
ve helloWorldTimer
tutulan self
.
İOS sürüm 10 ve üstünü hedefliyorsanız Timer
, potansiyel güçlü referans döngülerini basitleştiren blok tabanlı yorumunu kullanabilirsiniz , örneğin:
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
Genel olarak en iyisi olsa da, bütünlük adına, arka plan iş parçacıkları üzerinde zamanlayıcıları planlamak için yararlı olan gönderim zamanlayıcısını da kullanabileceğinizi belirtmeliyim. Gönderim zamanlayıcıları ile, blok tabanlı olduklarından , kullandığınız sürece eski target
/ selector
model ile bazı güçlü referans döngüsü zorluklarından kaçınır.Timer
weak
.
Yani:
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()
}
Daha fazla bilgi için, bkz bir Zamanlayıcı Oluşturma bölümünü Sevk Kaynak Örnekler içinde Tevzi Kaynakları bölümünde eşzamanlılık Programlama Kılavuzu.
Swift 2 için, bu cevabın önceki revizyonuna bakın .
dispatch_after
. Ya da tekrarlamayan NSTimer
.
İşte NSTimer
Swift 3 için ( NSTimer
olarak yeniden adlandırıldı Timer
) adlandırılmış bir işlev yerine bir kapatma kullanarak yanıt için bir güncelleme :
var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
(_) in
print("Hello world")
}
Eğer Eğer bir süre Değişmeye izin burada bazı kod her dakika yürütme basit bir çözüm var:
private func executeRepeatedly() {
// put your code here
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
self?.executeRepeatedly()
}
}
Sadece bir executeRepeatedly()
kez çalıştırın ve her dakika yürütülür. Yürütme, sahip olan nesne ( self
) serbest bırakıldığında durur . Ayrıca, yürütmenin durması gerektiğini belirtmek için bir bayrak da kullanabilirsiniz.
Hızlı 3.0'da GCD yeniden düzenlendi:
let timer : DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: .now(), interval: .seconds(60))
timer.setEventHandler
{
NSLog("Hello World")
}
timer.resume()
Bu, özellikle belirli bir Kuyrukta gönderim yapmanız gerektiğinde kullanışlıdır. Ayrıca, bunu kullanıcı arabirimi güncellemesi için kullanmayı planlıyorsanız CADisplayLink
, GPU yenileme hızı ile senkronize edildiğinden bakmanızı öneririm .