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:
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):
- Nastal čas na kakao...
- Tak nejdřív kakao ochutnáme...
- Programovací jazyk C: velmi, velmi stručně
- Objective C: to si vysvětlíme podrobněji
- Co jsme si o Objective C ještě neřekli...
- Nastal čas na kakao - Vznik a zánik objektů
- Nastal čas na kakao - Kopírování objektů
- Nastal čas na kakao - Skryté podtřídy
- Nastal čas na kakao - Základní služby objektů
- Nastal čas na kakao - Jak správně psát v Objective C
- Nastal čas na kakao - Jak správně importovat
- Nastal čas na kakao - Podtřídy, delegáti, vkládání, jak se to rýmuje?
- Nastal čas na kakao - Využití kategorií namísto dědičnosti
- Nastal čas na kakao - Vkládání objektů a přesměrování zpráv
- Nastal čas na kakao - Inicializace a rušení objektů
- Nastal čas na kakao - Metody initWith... a designovaný inicializátor
- Nastal čas na kakao - Inicializace: tipy a triky
- Nastal čas na kakao - Accesory: přístup k proměnným instancí
- Nastal čas na kakao - Šedá je teorie, zelený je strom života...
- Nastal čas na kakao - Více o XCode: inspektory
- Nastal čas na kakao - Aplikace RSS2: datový model
- Nastal čas na kakao - Aplikace RSS: implementace datového modelu
- Nastal čas na kakao - Aplikace RSS: parsování XML
- Nastal čas na kakao - Interface Builder a uživatelské rozhraní
- Nastal čas na kakao - Interface Builder: atributy objektů
- Nastal čas na kakao - Interface Builder: atributy objektů
- Nastal čas na kakao - Druhý kontrolér a dokončení aplikace
- Nastal čas na kakao - Drobná vylepšení a zdokonalení...
- Nastal čas na kakao - Ladění
- Nastal čas na kakao - Třídy Foundation Kitu
- Nastal čas na kakao - Třídy Foundation Kitu (2)
- Nastal čas na kakao - Textové řetězce: NS(Mutable)String
- Nastal čas na kakao - Čísla, binární data a další...
- Nastal čas na kakao - Archivace objektů
- Nastal čas na kakao - Trocha magie, aneb distribuované objekty
- Nastal čas na kakao - Málem bychom zapomněli: NSAutoreleasePool
- Nastal čas na kakao - Zpracování výjimek: NSException
- Nastal čas na kakao - NSInvocation a černá magie
- Nastal čas na kakao - Kakao v Tygrovi
- Nastal čas na kakao - Notifikace: nepřímé předávání zpráv
- Nastal čas na kakao - NSUserDefaults
- Nastal čas na kakao - Co nového ve Foundation Kitu
- Nastal čas na kakao – s Intelem, s Intelem, jedeme do...
- Co nového v Xcode
- Začínáme s AppKitem
- Jak MVC v Kakau vypadá doopravdy?
- Jak MVC v Kakau vypadá doopravdy: dokončení
- Přehled tříd AppKitu
- Nastal čas na kakao - Přehled tříd AppKitu 2
- Přehled tříd AppKitu 3: zbývající třídy GUI
- Přehled tříd AppKitu 4: textový systém
- Nastal čas na kakao - Přehled tříd AppKitu 5: hlavně grafika
- Přehled tříd AppKitu 6: dokumentový systém
- Přehled tříd AppKitu 7: dokončení
- Pojmenované vlastnosti objektů
- Pojmenované vlastnosti objektů: implementace
- Pojmenované vlastnosti objektů: relace 1:N
- Pojmenované vlastnosti objektů: řazení jmen a agregační funkce
- Sledování změn objektů
- Sledování změn objektů – ukázka
- Sledování změn objektů – zdrojový kód
- Sledování změn objektů: kód modelu
- Sledování změn objektů: přímý přístup
- Kontroléry a vazby
- Vázání vazeb
- Další vazby s jednoduchým kontrolérem
- Implementace a použití převodu hodnot
- Validace hodnot
- Validace a chyby, a jedna hezká vazba...
- Práce s polem objektů
- Základní vazby NSArrayControlleru
- Převodníky, přepínače, placeholdery
- Mírná vylepšení v mezích zákona
- Objective C 2.0 - novinky z Leoparda
- NSTreeController
- Programování v Cocoa - Pár tipů a triků
- Programování v Cocoa - Základy kreslení
- Kterak nakreslit modrý obdélník...
- Další služby pro kreslení
- Obrázky a písmenka...
- Události a myš
- Lepší práce s myší
- Události klávesnice
- Input Management
- Příkazy a schránka
- Další události
- Táhni a padni
- Byli jsme na tahu; nyní padneme.
- Zvolme si, jak vhodit
- Drobnosti a chybičky
- Speciální případy tahání či házení
- Kterak táhnout něco, co neexistuje?
- Jak na sítě...
- NSURLConnection
- Safari za minutu
- Služby WebKitu
- Kakao v Leopardu
- Druhé Objective C
- Druhé Objective C: různé drobnosti
- Druhé Objective C: kategorie a protokoly
- Druhé Objective C: nový příkaz cyklu
- Druhé Objective C: atributy a accesory
- Druhé Objective C: atributy a accesory
- 64 je dvakrát 32
- Ubicumque dulce est, ibi et acidum invenies...
- Irbis: že prý žádné novinky?
- Blok sem, blok tam, nám už je to všechno jasné...
- Bloky jsou i v AppKitu
- Irbis a Foundation Kit
- Kde jsou má data?
- Kde jsou má data? V NSCache!
- Soubor, jméno, URL, jak se to rýmuje...
- Další podpora NSURL
- Zabíjení!
- A máme tady i...OS!
- Systémové prvky GUI
- Programování pro iOS 1. díl - Rozdíly mezi "i" a "Mac"
- Programování pro iOS - 2. Začínáme programovat
- Programování pro iOS - 3. základní ovladače a propojení GUI s kódem
- Programování pro iOS - 4. Varovná hlášení
- Programování pro iOS - 5. Rámce a jejich řídicí objekty
- Programování pro iOS - 6. Ukládání dat
- Programování pro iOS - 7. Správa paměti a starý restík
- Programování pro iOS - 8. Dokončení aplikace
- Programování pro iOS - 9. Jak dostat aplikaci do iPhone
- Programování pro iOS - 10. Instalace aplikace do cizího iPhone
- Programování pro iOS - 11. Jak dostat aplikaci do libovolného iPhone
- Programování pro iOS - 12. Touching!
- Programování pro iOS - 13. Kreslíme na iPhone
- Programování pro iOS - 14. Udělejme gesto
- Programování pro iOS - 15. Další gesta
- Programování pro iOS - 16. Více prstů, více zábavy
- Programování pro iOS - 17. Podpora standardních gest
- Programování pro iOS - 18. Recognizery v iOS
- Programování pro iOS - 19. Další standardní recognizery
- Programování pro iOS - 20. Co nového v iOSu
- Programování pro iOS - 21. "Multitasking"
- Programování pro iOS - 22. Nulla est honesta avaritia nisi temporis
- Programování pro iOS - 23. Jak se aktivovat, jsme-li v pozadí
- Programování pro iOS - 24. Zbývající drobnosti
- Programování pro iOS - 25. Řídicí objekty rámců
- Programování pro iOS - 26. Jak se dělá UIViewController
- Programování pro iOS - 27. Kde vzít rámce
- Programování pro iOS - 28. Základní služby
- Programování pro iOS - 29. Práce s rámci
- Programování pro iOS - 30. Rotace zařízení
- Programování pro iOS - 31. Správa paměti v rámcích
- Programování pro iOS - 32. Řídicí objekt pro tabulky
- Programování pro iOS - 33. Řídicí objekt pro strom
- Programování pro iOS - 33. Více o UINavigationControlleru
- Programování pro iOS - 35. Ještě jednou UINavigationController
- Programování pro iOS - 36. Po navigátoru taby
- Programování pro iOS - 37. Více o UITabBarControlleru
- Programování pro iOS - 38. Dokončení UITabBarControlleru
- Programování pro iOS - 39. UIPopoverController
- Programování pro iOS - 40. Další triky UIPopoverControlleru
- Programování pro iOS - 41. Zbývající služby UIPopoverControlleru
- Programování pro iOS - 42. UISplitViewController
- Programujeme v
iTunesXcode 4 - Programování pro iOS - 44. Předvolby Xcode 4
- Programování pro iOS - 45. Práce v Xcode 4
- Xcode 4: projekt a cíle
- Xcode 4: práce s cíli
- Xcode 4: Build Settings
- Xcode 4: Build Phases
- Xcode4: Build Phases podruhé
- Xcode 4: Co jsou to Build Rules?
- Xcode4: taje editoru
- Xcode4: automatické doplňování v editoru
- XIBy chyby
- Více o XIBech
- Editor XIBů
- Inspektory pro XIBy
- Vazby mezi objekty v XIBech
- Vazby mezi objekty v kódu
- Paletky Xcode pro XIBy
- Xcode 4: levý sloupec
- Xcode 4: okno Organizer
- Xcode 4: okno Organizer, část druhá
- Xcode 4: co je to Workspace?
- Xcode 4: základy schémat
- Xcode 4: akční schémata