Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
+2 oy
760 kez görüntülendi
ios development kategorisinde tarafından
tarafından yeniden etikenlendirildi

Swift'de NSNotificationCenter nasıl kullanılır, nasıl notification yollayabilir ve observer'ile karşılayabiliriz.

1 cevap

+2 oy
tarafından
 
En İyi Cevap

NSNotification oldukça kullanışlı bir araçtır ve class bağımsız çalışırlar. proje dosyası içerisindeki tüm class'lar tarafından observe edilebilirler.

projemiz'de yer alan herhangi bir class içerisinden başka bir class'da yer alan bir methodu çağıracağımızı farz edersek.

öncelikle aşağıdaki gibi bir post notification oluşturmamız gerekir.

var myClass:MyClass! = nil
func initiateMyClass() {     
   self.myClass = MyClass()
}

func postNotificationNow() {
    var myArray:NSArray = ["value1, value2"]
    NSNotificationCenter.defaultCenter().postNotificationName("myNotification", object: myArray)        
}

postNotificationNow metodu çağrıldığında gördüğünüz gibi postNotificationName'ile bir notification göndereceğiz.
"myNotification" notification'a verdiğimiz isim,
object'ise notification ile beraber yollamak istediğimiz datamız. bu örnekte bir array gönderiyoruz, eğer boş bırakmak isterseniz basitçe "nil" değerini verebilirsiniz.

sıra geldi bu notification ateşlendiğinde karşılayabilecek bir observer yazmaya.
observer'lar içinde bulundukları class'ların init methodun'da yer almalı ve class yaratıldığında register edilmelidirler.
ve pek tabiki de class remove edilirse önceden unregister edilmelidirler. aksi takdirde uygulamamız çökecektir.

Observer block based olabileceği gibi selector base'de olabilir.
basit bir NSObject class'ında block base observer nasıl oluyor görelim.

import Foundation

class MyClass : NSObject {

override init() {        
    super.init()

    NSNotificationCenter.defaultCenter().addObserverForName("myNotification", object: nil, queue: NSOperationQueue.mainQueue()) { (object:NSNotification!) -> Void in
        var receivedArray:NSArray = object.object as NSArray
        println(receivedArray)
    }
}

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}


}

gördüğünüz gibi init içerisinde block based bir observer oluşturduk, "myNotification" post edeceğimiz notification'a verdiğimiz isim,
"queue" 'ile notification operasyonun hangi thread'da çalışacağını belirtebliyoruz.
ve block içerisinde notification'la beraber gelen object datasını NSArray'e çevirip, println'ile ekrana bastırıyoruz.

yukarıda'da dediğim gibi eğer obserbver'in içerisinde yer aldığı class kaldırılacakse öncelikle ilgili class'dan observer'i aşağıda görebilieceğiniz şekilde unregister etmemiz gerekir. aksi takdirde uygulama çökecektir.

func removeMyClass() {

NSNotificationCenter.defaultCenter().removeObserver(self.myClass)
self.myClass = nil

}
...