Mobil Programlama

iOS

Uyarılar (Notifications)

Lisans: Creative Commons 11.12.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

NSNotificationCenter

NSNotificationCenter uygulama içerisinde bir uyarı oluşturmamızı sağlayan sınıftır. Bir uyarı oluşturulduğunda bunu dinlemek üzere kaydolmuş (register) metotlar harekete geçer ve metot içerisindeki kod uygulanarak istenilen işlem gerçekleştirilir. Farklı sınıflar arasında haberleşmeyi sağlamak ya da uygulama içerisinde asenkron güncellenecek metotları çalıştırmak için idealdir.

Şimdi NSNotificationCenter kullanımını bir örnek üzerinden anlatalım. Örneğimizde, yine daha önce olduğu gibi UIButton sınıfından bir düğme tanımlayarak bir metot çalıştıracağız. Ancak bu metot başka bir sınıftaki metotu uyarmak üzere ayarlanacak ve kullanıcı düğmeye bastığında başka bir sınıftaki metot harekete geçecek.

İlk olarak Interface Builder yardımıyla ekrana bir düğme koyalım ve bu düğmeye bir IBAction metodu bağlayalım:

Kullanıcı düğmeye bastıktan sonra ViewController.h dosyasındaki sendNotification metodu harekete geçecektir.

 

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
- (IBAction) sendNotification:(id)sender;
@end

 

sendNotification metodu aşağıdaki şekilde davranır:

 

- (IBAction) sendNotification:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_CONST object:self];
}

 

NSNotificationCenter içerisinden defaultCenter ile uygulamanın uyarı sistemi çağırılır. postNotificationName ise gönderilecek uyarının anahtar değeridir. Uyarılar gönderilirken ayırdedilebilmesi için her uyarının farklı bir anahtar değeri bulunmalıdır. Bu şekilde uyarıyı dinleyen diğer sınıflar gelen sinyalleri ayırdedebilir. Biz burada NOTIFICATION_CONST adında bir değer tanımladık ve bunu Constant.h dosyasında belirttik.

 

#define NOTIFICATION_CONST @"NotificationCenter"

 

Bir sonraki adımda AppDelegate dosyası içerisinde notificationListener adında bir metot tanımlıyoruz. Bu metodun görevi NOTIFICATION_CONST değeriyle bir uyarı gönderildiğinde buna cevap vermek olacaktır.

 

#import <UIKit/UIKit.h>
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;
- (void) notificationListener;
@end

 

AppDelegate.m dosyasında aşağıdaki değişiklikleri yapalım:

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(notificationListener)
        name:NOTIFICATION_CONST
        object:nil];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
- (void) notificationListener
{
    UIAlertView *alert = [[UIAlertView alloc]
        initWithTitle: @"Turkcell"
        message: @"Uyari alindi!"
        delegate: nil
        cancelButtonTitle:@"OK"
        otherButtonTitles:nil];
    [alert show];
}

 

Uygulama yüklenmesini bitirdikten sonra didFinishLaunchingWithOptions içerisinde NSNotificationCenter çağırılıyor. Burada addObserver ile dinleyici olarak AppDelegate belirleniyor. selector ise istenilen uyarı geldiğinde harekete geçecek metodu anlatıyor. Biz burada notificationListener metodunu seçiyoruz. name ise gelen uyarının tanımlayıcısını oluşturuyor. Burada AppDelegate metodu NOTIFICATION_CONST ile belirlenen bir uyarı geldiğinde notificationListener metodunu harekete geçirecek şekilde ayarlanmış oldu. notificationListener metodu ise ekrana UIAlertview tipinde bir mesaj ekranı getirecektir.

Şimdi ViewController içerisinde oluşturduğumuz düğmeye basarak AppDelegate içerisinden oluşturulan mesaj ekranına bakalım:

 

Bir sınıfa kaydedilmiş (register) dinleyiciyi (observer) yok etmek için de aşağıdaki metodu çalıştırırız. Bir sınıf hayatını tamamladığında bellek hatalarına (memory leak) yol açmamak için bunu yapmamız gerekir.

 

- (void)applicationWillTerminate:(UIApplication *)application
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}