NotificationCenter ile Bildirim Mekanizması Kurmak

Bu yazıda NSNotificationCenter mekanizmasının ne olduğunu ve nasıl çalıştığını öğreneceksiniz.

Nedir?

Apple şu şekilde açıklıyor:

A notification dispatch mechanism that enables the broadcast of information to registered observers.

Biz de şu şekilde tanımlayalım:

NSNotificationCenter Observer tasarım desenini kullanarak sınıflar arası mesaj ve obje alışverişi için kullanılan bir haberleşme mekanizmasıdır.

 

Ne Değildir?

NSNotificationCenter, Push notification ile karıştırılmamalıdır. Push Notifications APNS nin sağlamış olduğu kullanıcılara anlık bildirim gönderme servisine verilen isimdir ve kullanıcılar ile ilgilidir. Öte yandan NSNotificationCenter uygulamamızı oluşturan sınıflar arasındaki konuşan-dinleyen iletişimini sağlayan bir mekanizmadır ve kullanıcıyı değil; geliştiriciyi ilgilendirir.

 

Nasıl Çalışır?

NSNotificationCenter kullanarak X aksiyonu olduğunda bir broadcast mesajı göndeririz. Bu broadcast mesajını dinleyen tüm sınıflar ilgili aksiyon gerçekleştiğinde o mesajın bir kopyasını elde etmiş olur.

Bu konu genelde Delegation konsepti ile karıştırılır. Delegation kullanarak da sınıflar arası haberleşme gerçekleşir fakat Delegation kullanarak obje veya mesaj iletimi tek bir alıcı ile gerçekleşir.

Delegation hakkında bilgi almak için Delege ve Protokol Kullanımı yazıma göz atabilirsiniz.

Öte yandan NSNotificationCenter broadcasting yaparak mesajı kendisini dinleyen tüm sınıflara gönderir. Yani burada One-to-Many ilişkisi vardır.

Mesajların birbirine karışmaması için her bir mesaj türü için bir isim tanımlarız. İlgili notification ismi ile gönderilmiş olan bir mesaj, o mesajdan haberdar olmak isteyen sınıf tarafından aynı isim ile dinlenir.

Gönderici tarafından notification atıldıktan sonra bu mesajı dinleyen sınıfın içindeysek bizim belirlemiş olduğumuz bir #selector metodu otomatik olarak çalışır. Bu tek seferlik bir işlem değildir. Gönderici ne zaman notification gönderse alıcının hemen haberi olur.

 

Örnek

Örnek olarak her uygulamayı arkaplana atıp tekrar girdiğimizde internet bağlantımızı kontrol eden ve internet bağlantısı yoksa ilgili sınıflara notification gönderen bir mekanizmamız olsun.

Bunun için AppDelegate in applicationWillEnterForeground metoduna şunu yazalım:

Not: Reachability sınıfı cihazın internet bağlantısını kontrol etmemizi sağlıyor. Kaynak kodunu yazının altında paylaşacağım.

Bu notification ı observe eden sınıfların ismi AViewController, BViewController, CViewController olsun.

Her bir ViewController ın viewDidLoad() metodunda dinlemek istediğimiz notification a register olalım:

“notificationInternetConnection” notification una register olduk. Böylece register olduğumuz sınıfın içindeyken ilgili notification post edilirse sınıfın bundan hemen haberi olacak ve checkInternetConnection metodu çalışacak.

Ayrıca ilgili sınıf silinirken register olduğumuz notification u dinlemeyi bıraksak iyi olur.

Bunu sınıfın içinde herhangi bir yere yazsanız olur. Ben viewDidLoad() altında yazmayı tercih ediyorum.

 

Bonus

NSNotificationCenter ın diğer bir güzelliği ise post edilen mesaj ile beraber bir obje gönderilebilmesi.

Hatırlarsanız,

metodunu yazarken object parametresini nil göndermiştik fakat buraya duruma göre istediğiniz bir objeyi koyup alıcılara ulaşmasını sağlayabilirsiniz.

Örneğin Car sınıfından türemiş bir objeniz var ve bunu notification u post ederken parametre olarak verdiniz. Observer konumundaki sınıflarınızda çalışan #selector metodunda bu objeyi şu şekilde alabilirsiniz:

 

Özet

NotificationCenter Observer tasarım desenini kullanarak sınıflar arası mesaj ve obje alışverişi için kullanılan bir haberleşme mekanizmasıdır.

Her bir mesaj tipi için bir gönderici ve çoklu alıcı vardır.

Her mesaj tipi için bir tanımlayıcı isim kullanmamız gerekir.

Örnek projeye buradan ulaşabilirsiniz.