Nastal čas na kakao - NSUserDefaults - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Jaký fotograf/ka získal/a cenu za nejpopulárnější příspěvek v Nikon Photo Contest?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Začínáme s

Nastal čas na kakao - NSUserDefaults

27. května 2005, 00.00 | Ačkoli jsme minule už zběžně nahlédli do tygřích novinek, dnes se ještě naposledy budeme zabývat "obyčejným Foundation Kitem", tedy službami, jež jsou k dispozici v jakékoli versi Mac OS X. To proto, že nám ještě z celkového přehledu zbyla jedna dosud nepopsaná třída – NSUserDefaults.

Ačkoli jsme minule už zběžně nahlédli do tygřích novinek, dnes se ještě naposledy budeme zabývat "obyčejným Foundation Kitem", tedy službami, jež jsou k dispozici v jakékoli versi Mac OS X. To proto, že nám ještě z celkového přehledu zbyla jedna dosud nepopsaná třída – NSUserDefaults.

Seznámíme se tedy nejprve s ní, a až příště se ponoříme do konkrétních novinek, jež Tiger do Foundation Kitu přidal (jako třídy NSAffineTransform, NSCalendar, novinky tříd NSError a NS...Formatter, třídy NSIndexPath, NSLocale či NSMetadata, nové služby třídy NSString, a podobně). Tak si udržíme lepší přehled, co můžeme používat v kterékoli versi Mac OS X, a co je k dispozici pouze v té nejnovější.

Mimochodem: jistě, ještě jsme přeskočili třídu NSTimer: to proto, že její služby jsou závislé na tzv. event loopu, a tedy jsou prakticky použitelné v aplikacích (a ne v jednoduchých řádkových programech); proto si její popis ponecháme až na později, až se budeme zabývat aplikacemi a AppKitem. Vyjdeme-li tedy z toho, v jakém pořadí jsme se o třídách Foundation Kitu zmínili v úvodním přehledovém článku, jsou nyní na řadě uživatelské předvolby a třída NSUserDefaults.

Jak to vůbec funguje?

Dříve, než se začneme seznamovat s konkrétními službami třídy NSUserDefaults, si musíme vysvětlit, co to vlastně jsou a jak fungují v API Cocoa uživatelské předvolby – pokud vím, žádný jiný systém podobnou službu nenabízí, takže většina čtenářů tohoto článku zřejmě nebude mít s ničím podobným zkušenosti.

Základním prvkem předvoleb je dvojice klíč-hodnota, podobně, jako tomu je u třídy NS(Mutable)Dictionary. Klíč vždy určuje jméno předvolby (např. "BarvaTextuVHlavnímOkně"), zatímco hodnota určuje skutečnou hodnotu předvolby ("Black"). Dvojice jsou uloženy v tzv. doménách; doménu si můžeme představit jako NSDictionary, obsahující libovolný počet dvojic. Systém uživatelských předvoleb pak spravuje libovolný počet pojmenovaných domén v předem zadaném pořadí; chceme-li vyhledat hodnotu k zadanému klíči, prohledává třída NSUserDefaults postupně domény podle jejich pořadí, až nalezne odpovídající dvojici. Každý uživatel přitom samozřejmě má svou vlastní skupinu domén, jež mohou obsahovat jeho privátní předvolby, odlišné od předvoleb všech ostatních uživatel.

Neurčíme-li jinak, obsahuje standardní objekt třídy NSUserDefaults následující domény v uvedeném pořadí:

  • argumenty: doména argumentů je vytvořena při spuštění aplikace na základě parametrů příkazové řádky a slouží především pro ladicí účely – jejím prostřednictvím můžeme specifikovat jakékoli požadované předvolby pouze pro jediné spuštění aplikace;
  • aplikace: aplikační doména obsahuje všechny předvolby, specifické pro danou aplikaci. Je druhá v pořadí; to znamená, že předvolby v ní uložené mají přednost před předvolbami uloženými ve všech ostatních doménách vyjma domény argumentů;
  • globální: globální doména obsahuje předvolby, které uživatel specifikuje pro všechny aplikace – je-li např. v globální doméně uvedena dvojice ("NSApplicationFontSize",12), budou všechny aplikace – jež nemají jiné nastavení v aplikační doméně ani v doméně argumentů – používat standardně dvanáctibodové písmo;
  • jazykové: domény odpovídající specifickým jazykům, v pořadí jež může uživatel měnit na úrovni systémových předvoleb.V těchto doménách budou samozřejmě obvykle uloženy předvolby související se zvoleným jazykem – např. v doméně "Czech" bude třeba předvolba ("NSApplicationFont","HelveticaCE"), která zajistí, že aplikace která běží v češtině bude standardně využívat českou Helvetiku;
  • poslední doménou je tzv. doména registrační; ta slouží k určení standardních hodnot, které se použijí jestliže není požadovaná předvolba uložena nikde jinde.

Konkrétní API

Ukažme si opět konkrétní příklad zdrojového textu. Jedna z prvních věcí které každá aplikace udělá bude pravděpodobně získání standardního objektu třídy NSUserDefaults obsahujícího standardní domény, a nastavení hodnot domény registrační (která je ihned po startu aplikace samozřejmě prázdná):

NSUserDefaults *def=[NSUserDefaults standardUserDefaults];
[def registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
  @"12",@"Počet",
  @"YES",@"JeToTak?",
  @"Pepa z depa",@"Jméno",
nil]];

Kdekoli v aplikaci pak můžeme volně používat hodnoty z databáze; pro tento účel máme k dispozici řadu zpráv, mezi kterými jsou např. tyto:

NSLog(@"Počet je %d",[def integerForKey:@"Počet"]);
NSLog([def boolForKey:@"JeToTak?"]?@"Je to pravda":@"Nejni to pravda!");
NSLog(@"Jméno: %@",[def stringForKey:@"Jméno"]);
id o=[def objectForKey:@"Tralala"];
if (o) ...
else NSLog(@"Default \"Tralala\" neexistuje");

Uvědomme si, co se v takovém případě vlastně děje: jakmile pošleme objektu def např. zprávu integerForKey: s argumentem @"Počet", začnou se prohledávat domény uživatele, který aplikaci spustil, v pořadí daném pořadím domén uložených v objektu def. Standardně se tedy nejprve zjistí, nebyl-li při spuštění aplikace použit parametr "Počet=n" (argumentová doména), pak se klíč "Počet" postupně hledá v aplikační doméně, v doméně globální a v doménách jazykových. Jestliže není nalezen v žádné z nich, použije se nakonec hodnota 12 z domény registrační, do které byla uložena při startu aplikace.

Aplikace samozřejmě může měnit obsah své aplikační domény (jakmile se uživatel rozhodl některou z předvoleb v jejím rámci změnit):

[def setBool:NO forKey:@"JeToTak?"];
[def setInteger:333 forKey:@"Počet"];
[def setObject:anyObject forKey:@"Tralala"];

Co ale v případě, že jeden modul změní hodnoty v doménách a jiný je využívá? Uvědomme si, že pro takové případy již známe dokonalé řešení – třídu NSNotificationCenter, se kterou jsme se seznámili před chvilkou: jakmile dojde ke změně předvoleb, je prostřednictvím této třídy automaticky rozeslána standardní zpráva "NSUserDefaultsChanged". Pokud tedy některý objekt potřebuje být informován o aktuálním stavu předvoleb, stačí, vyžádá-li si zprávou addObserver..., s níž jsme se seznámili minule, zasílání notifikací "NSUserDefaultsChanged".

Třída NSUserDefaults nabízí řadu dalších metod pro správu persistentních i dočasných domén, pro přidávání i odebírání domén ze standardního seznamu, pro rušení existujících domén a vytváření nových, pro přístup k předvolbám jiných uživatelů a tak dále. Nemá však smysl je zde podrobně popisovat, protože jsou využívány jen zřídka.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Začínáme s  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: