Bazı zamanlar uygulama çalışırken arka tarafta önemli işlemler gerçekleşir. Kimi zaman uygulama internet üzerinden bir veri getirir veya gönderir, kimi zaman uzak bir sunucudan giriş onayı alır. Kısacası uygulamanın türüne ve kullanım alanına göre değişen, kullanıcının görmesemde olur dediği kısımlar. Bu kısımlar bazen bu kadar büyük işlemler de olmayabilir. Tam bu noktada karşımıza Timer yapısı çıkıyor. Swift ile birlikte hayat kurtaran bu özellik Swift 101 serimizin yeni konuğu. Bu ilginç ve önemli konuya gelin biraz yakından bakalım.
Adım 1: Uygulama Tasarımı
Uygulamamız bir kronometre uygulaması olacak. Saniyelerin kullanıcıya gösterilmesi için bir adet Label kullandık. Zamanın başlatılması, duraklatılması ve yeniden başlatılması için ise üç adet TintedButton kullandık.
Adım 2: Tasarımı Kodla Bağlayalım
Tasarımı kodla bağlamak oldukça kolay. Bunun için öncelikle Label yapısına tıklayalım. Ardından Control tuşuna basılı tutarak ViewController dosyasına sürükleyelim. Bir isim belirledikten sonra işlem tamam. Aynı işlemleri butonlarımız içinde yapacağız fakat butonları Action olarak kullanmalıyız. Bu sayede butonları tıklanabilir bir şekilde kullanabileceğiz.
Adım 3: Timer Sınıfından Bir Obje Oluşturalım
Timer sınıfının bize sunduğu imkanlardan faydalanabilmek için öncelikle bir obje oluşturmalıyız. Bu obje Timer sınıfından oluşturulacağı için özellikleri de kolayca kullanabileceğiz.
var timer = Timer()
Adım 4: Zamanlayıcı Oluşturalım
Şimdi değişkenimizi oluşturduğumuza göre sıra zamanlayıcıyı oluşturmaya. Bunun için Timer sınıfının scheduledTimer metodunu kullanacağız. Metodu biraz incelediğimizde ilk olarak timeInterval özelliğini görüyoruz. Bu özellik işlemin kaç saniye aralıklarla gerçekleşeceğini gösteriyor. Biz bir kronometre uygulaması yaptığımız için bunu 1 saniye olarak belirledik. İkinci özellik ise target. Bu ViewController’ı işaret ediyor. Biz içinde bulunduğumuz ViewController’ı işaret etmek için self metodunu kullanıyoruz. Üçüncü özelliğimiz selector. Bu özellik zamanlayıcının yapacağı objective c fonksiyonunu belirtir. Bu fonksiyonun ise normal fonksiyonlardan herhangi bir farkı yoktur. Dördüncü özelliğimiz ise userInfo. Bu özellik kullanıcıdan herhangi bir bilgi gelip gelmeyeceğini sorgular. Bizim uygulamamızda gelmeyeceği için nil olarak işaretledik. Son özelliğimiz ise repeats. Bu ise işlemin tekrarlanıp tekrarlamayacağı ile ilgili. Kronometre sürekli geri sayacağı için true olarak işaretleyeceğiz.
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(countDown), userInfo: nil, repeats: true)
Adım 5: İsteğe Göre Durdurma
Zamanlayıcı programlanan şekilde çalışmaya başladığında hiç durmadan devam eder. Fakat burada da olduğu gibi bazen durdurmak isteyebiliriz. Bunun için invalidate metodunu kullanırız. Bu sayede zamanlayıcı durur ve uygulama hata vermeden devam eder.
timer.invalidate()
Final
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var timerLabel: UILabel!
var timer = Timer()
var count = 25
var pause = true
var start = true
override func viewDidLoad() {
super.viewDidLoad()
}
@objc func countDown () {
count -= 1
timerLabel.text = "\(count)"
if count <= 0 {
timerLabel.text = "\(count)"
timer.invalidate()
}
}
@IBAction func startButton(_ sender: Any) {
if start == true {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(countDown), userInfo: nil, repeats: true)
start = false
}
}
@IBAction func pauseButton(_ sender: Any) {
if pause == true && count != 25{
timer.invalidate()
pause = false
}else if pause == false && count != 0{
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(countDown), userInfo: nil, repeats: true)
pause = true
}
}
@IBAction func restartButton(_ sender: Any) {
timer.invalidate()
count = 25
timerLabel.text = "\(count)"
start = true
}
}
Göründüğü gibi kronometremiz Start butonuna basınca çalışmaya başlıyor. Birkaç kez tıklamaya rağmen programda herhangi bir bozulma olmadan çalışmaya devam ediyor. Ardından Pause butonuna basınca süre duruyor. Tekrar basınca kaldığı yerden devam ediyor. Burada kullanıcının süre 25 ve 0 iken pause butonunu kullanması engellendi. Bu sayede süre sadece start butonu ile başlayacak ve 0 olduğunda sayaç çalışmaya devam etmeyecek. Restart butonu ile de sayaç tekrar eski haline dönüyor. Kullanımı oldukça kolay bu sınıf sadece sayaç yapmak için değil arka planda sürekli kendi kendine çalışmasını istediğiniz her iş için kullanabilirsiniz. Swift‘in bir güzelliği daha…