© 2013 All rights reserved.
0

iPhone & iPad developer: NSNotification, NSNotificationCenter

Občas velmi užitečným mechanismem pro předávání zpráv mezi dvěma objekty může být použití notifikací.

Nepřímé předávání zpráv, možná bychom mohli nazvat jako Signal Handler, je mechanismus, kdy potřebujeme kontaktovat jiný objekt (nebo skupinu objektů), který není s aktuálním objektem, nebo modulem přímo propojen, a nemůžeme jej tedy
jedndouše kontaktovat. V podstatě můžeme přes notifikace kontaktovat objekty nebo moduly, které:

  • nejsou propojeny s aktuálním modulem a nechceme s nimi navazovat připojení
  • nevíme který objekt danou aktuální notifikaci potřebuje

NSNotificationCenter nefunguje tak, že kontaktujeme předem určený objekt, ale pouze pošleme zprávu do notifikačního centra, a všechny objekty, které danou zprávu dokáží zpracovat ji musí očekávat. Zpráva není odesílána danému přijemci, ale obsahuje pouze název, dle kterého ji objekt přijme nebo nepřijme, podle registrovaného handleru na danou zprávu.

 

Podívejme se na reálný přiklad, který není možná ideální, ale bude správně simulovat použitelnost NSNotification:

Máme aplikaci, která obsahuje mapu, k dané mapě existuje nastavení, kde volíme zobrazení mapy:

 



nsnotificationcenter

 

Nastavení otevíráme pouze přes IBAction:

Třída AppSettings není nijak s aktuální třídou propojena, ale obsahuje UISegmentedControl, kterým můžeme přepínat zobrazení mapy.

Pro přepnutí zobrazení mapy si vytvoříme IBAction, která bude pouze vytvářet post do NSNotificationCenter:

Tato funkce, po kliknutí na tlačítko volá postNotificationName, a pošle zprávu do NSNotificationCenter, kde si ji mohou další objekty odchytit, podle jejího názvu.

V daném objektu poté pouze registrujeme notifikace, které naslouchají na dané zprávě, například:

Po vyvolání notifikace bude objekt naslouchat nad NSNotificationCenter a čekat na dané zprávy, pokud se centru objeví, přizpůsobí tomu běh aplikace, v tomto konkrétním případě volá obslužné funkce.

Comments are closed for this page

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836