Kde jsou má data? V NSCache! - 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

 

Kde se narodil známý fotograf František Drtikol?

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

Seriály

Více seriálů



Software

Kde jsou má data? V NSCache!

2. února 2010, 00.00 | Na dnešek jsme si pak nechali nový kontejner, určený právě pro ukládání dočasných objektů, jež podporují protokol NSDiscardableContent – třídu NSCache.

V minulém dílu našeho seriálu o programování ve vývojovém prostředí Cocoa jsme si začali povídat o podpoře, již v Mac OS X 10.6 nově nalezneme pro práci s dočasnými daty a s cache: ukázali jsme si protokol NSDiscardableContent i jeho konkrétní implementaci NSPurgeableData. Na dnešek jsme si pak nechali nový kontejner, určený právě pro ukládání dočasných objektů, jež podporují protokol NSDiscardableContent – třídu NSCache.

Cache je v zásadě slovník

Základní programátorské rozhraní, jež třída NSCache nabízí, jsou důvěrně známé metody běžně používané třídy NSMutableDictionary:

-objectForKey:key;
-(void)setObject:obj forKey:key;
-(void)removeObjectForKey:key;
-(void)removeAllObjects;

Podrobný popis těchto služeb je zbytečný; fungují tak, jak jsme si dávno zvykli na funkci odpovídajících metod u třídy NSMutableDictionary. Třída NSCache však má několik specifických vlastností, jež podporují právě její využití pro automaticky odstranitelná data:

• kontejner je plně thread-safe, můžeme k němu tedy bezpečně přistupovat zároveň z různých vláken, aniž by bylo zapotřebí definovat kritické sekce;

• při odstranění objektu (který odpovídá protokolu NSDiscardableContent) z kontejneru se tomuto objektu automaticky pošle zpráva discardContentIfPossible (a jak uvidíme níže, naopak objekt, jehož obsah byl z libovolného důvodu zrušen, může být z cache automaticky odstraněn);

• na rozdíl od třídy NSMutableDictionary, jež se při vracení objektů nijak o správu paměti nestará, NSCache korektně vrací objekty uložené do aktivního autorelease poolu (tj. implementace metody objectForKey: obsahuje kód "return [[obj retain] autorelease]" nebo jeho funkční ekvivalent). Můžeme se tedy spolehnout na to, že objekt nám "nezmizí pod rukama", ani v případě, kdy se v jiném vlákně cache vyprázdní.

Správa velikosti

Další služby třídy NSCache umožňují programátorovi blíže specifikovat pravidla, podle nichž se bude její konkrétní instance chovat a na jejichž základě se rozhodne, kdy a který vložený údaj odstranit. Jde o následující metody:

-(void)setCountLimit:(NSUInteger)lim;

Metoda setCountLimit: nastaví horní limit počtu objektů, uložených v kontejneru – je-li jich v něm uloženo více, může cache kdykoli podle vlastního uvážení některé z objektů vyřadit. Nula znamená "žádný limit" (přesněji řečeno, standardní systémový limit, nijak neovlivněný programátorem).

Je třeba mít na paměti, že limit je interpretován pouze jako doporučení, a cache se podle něj řídit může, ale také nemusí: překročí-li počet objektů v kontejneru zadaný limit, může cache odstranit některý ze svých prvků ihned, později, nebo třeba také vůbec nikdy.

Druhá z možností pro řízení velikosti cache přiřazuje každému z objektů "váhu"; k tomu slouží alternativní metoda pro uložení objektu do kontejneru:

-(void)setObject:obj forKey:key cost:(NSUInteger)num;

Ačkoli v principu můžeme kterémukoli objektu přiřadit libovolnou "cenu", dokumentace zdůrazňuje, že v podstatě jediná smysluplná cena je skutečná velikost dat v bytech, je-li snadno zjistitelná (nebo existuje-li její dobrá a snadno zjistitelná aproximace). Nemá naproti tomu smysl snažit se velikost spočítat, pokud by výpočet byl komplikovaný – pak by totiž náročnost tohoto výpočtu patrně anulovala výhody z využití cache. Dokumentace varuje také před pokusy využívat uměle generovaných nereálných "cen" pro ovlivnění funkce cache a pořadí, v němž jsou objekty uvolňovány; zde je potenciální problém v tom, že algoritmus, volící objekty, jež mají být z cache odstraněny, se může kdykoli změnit, a mechanismus, efektivní v jednu chvíli s jedním algoritmem by se s jiným mohl ukázat velmi nešikovným.

Jako cenu můžeme zadat i nulovou hodnotu; to je ekvivalentní standardní zprávě setObject:forKey:.

S "cenami" pak samozřejmě souvisí druhá metoda pro řízení velikosti cache:

-(void)setTotalCostLimit:(NSUInteger)lim;

Tato služba funguje velmi podobně, jako výše popsaná metoda setCountLimit:; na rozdíl od počtu objektů v cache však bere v úvahu jejich celkovou "cenu", spočtenou na základě hodnot, použitých jako třetí argument při vkládání objektů pomocí služby setObject:forKey:cost:. Stejně jako u metody setCountLimit: zde ovšem platí to, že nula znamená žádný (resp. standardní) limit. Stejně také platí to, že cenový limit je pouze doporučením, podle nějž se cache řídit může a nemusí.

Nakonec jen poznamenejme, že pro oba limity jsou samozřejmě k dispozici i adekvátní přístupové metody pro zjištění aktuální hodnoty:

-(NSUInteger)countLimit;
-(NSUInteger)totalCostLimit;

Automatické odstranění objektů

Již jsme se zběžně zmínili o tom, že kontejner NSCache umí ještě jednu velmi šikovnou věc: pokud je některý z objektů v něm uložených úspěšně "vyprázdněn" metodou discardContentIfPossible, cache tento (již prázdný a tedy obecně nepoužitelný) objekt ihned automaticky odstraní – pokusíme-li se získat jej tedy pomocí metody objectForKey:, získáme hodnotu nil (pokud mezitím samozřejmě nebyla s týmž klíčem do kontejneru uložena nová hodnota). Ve většině případů je to logické a žádoucí chování; chceme-li ale, můžeme je vypnout pomocí služby

-(void)setEvictsObjectsWithDiscardedContent:(BOOL)b;
-(BOOL)evictsObjectsWithDiscardedContent;

Možnosti delegáta

Každá instance třídy NSCache může mít delegáta; pro jeho nastavení (a zjištění) slouží standardní dvojice zpráv

-(void)setDelegate:del;
-delegate;

Delegát by měl odpovídat protokolu NSCacheDelegate, který obsahuje jedinou zprávu

-(void)cache:(NSCache*)cache willEvictObject:obj;

kontejner ji pošle delegátovi těsně před odstraněním libovolného objektu. Pro udržení konsistence a zabránění rekursi delegát v implementaci této zprávy nesmí obsah cache měnit.

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

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

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

Uživatelské jméno:

Heslo: