Jak na sítě... - 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ů



Informace

Jak na sítě...

4. dubna 2007, 00.00 | V několika dalších dílech se podíváme na to, jak se v prostředí Cocoa pracuje se sítí a se zdroji na Internetu.

Minule jsme si ukázali, kterak "tahat a házet" neexistující soubory – a tím jsme dokončili naše povídání o tom, jak programovat vlastní potomky třídy NSView. Samozřejmě jsme si zdaleka neřekli vše; tento seriál ovšem nemůže plnit roli kompletní referenční příručky pro vývojové prostředí Cocoa: ukazujeme si v něm pouze základy...

V několika dalších dílech se podíváme na to, jak se v prostředí Cocoa pracuje se sítí a se zdroji na Internetu.

Leckdy to jde samo...

My už jsme se v některých příkladech s prací s Internetem setkali. Jedním z příkladů aplikací, na nichž jsme si ilustrovali práci v prostředí Cocoa, byla ostatně jednoduchá čtečka kanálů RSS. Viděli jsme, že v podstatě nebylo třeba ve zdrojovém kódu nic řešit, stačilo jen zadat požadované URL. Skutečně, Cocoa obsahuje řadu služeb typu dataWithContentsOfURL a podobně – podívejme se třeba, jak můžeme načíst výchozí stránku MujMacu:

id s=[NSString stringWithContentsOfURL:
  [NSURL URLWithString:@"http://www.mujmac.cz"]
  encoding:NSASCIIStringEncoding error:&err];

Podobně je tomu i u většiny "dekodérů" – kupříkladu standardní dekodér XML dokáže data rovnou načíst ze zadaného URL apod. Proto se nejprve podíváme malinko blíže na samotnou třídu NSURL.

NSURL

Ačkoli v principu by mohly jako argumenty všech metod typu xxxWithContentsOfURL: sloužit textové řetězce (jež by obsahovaly odpovídající URL stejně jako textové řetězce v argumentech metod typu xxxWithContentsOfFile: obsahují jména souborů), prostředí Cocoa namísto toho používá pro specifikaci URL objekty speciální třídy, NSURL.

V těch nejjednodušších případech nám to jen mírně komplikuje práci, neboť musíme – stejně, jako je tomu v příkladu nahoře – "navíc" psát URLWithString:. V dlouhé řadě jiných případů nám to ale usnadní práci; můžeme kupříkladu velmi snadno ověřit, zda je URL zadané uživatelem korektní:

NSString *s=[textField stringValue];
NSURL *url=[NSURL URLWithString:s];
if (!url)
  NSRunAlertPanel(@"Bad URL",@"Bad URL \"%@\" ...", ... , url);
else ...

Ještě daleko šikovnější je to, že třída NSURL se dokáže sama postarat o spoustu věcí, s nimiž bychom jinak měli "ručně" spoustu práce – kupříkladu práce s URL, jež reprezentují soubory:

NSString *s=[textField stringValue];
NSURL *url=[NSURL URLWithString:s];
if ([url isFileURL])
  NSRunAlertPanel(@"File",@"File \"%@\"...", ..., [url path]);
...
NSURL *furl=[NSURL fileURLWithPath:path];
...

Podobně příjemné je to, že můžeme pohodlně pracovat s relativními URL – stačí specifikovat výchozí URL, jež se použije v případě, že daný textový řetězec není kompletní:

NSString *s=[textField stringValue];
NSURL *url=[NSURL URLWithString:s
  relativeToURL:[NSURL URLWithString:@"http://www.mujmac.cz"]];

Samozřejmě že si můžeme vyžádat kteroukoliv z částí URL (pomocí zpráv scheme, host, port, path, ...). URL také dokáže načíst svůj obsah a udržovat jej v cache paměti; tento obsah si můžeme kdykoli vyžádat pomocí zprávy resourceDataUsingCache:, pomocí jejíhož argumentu můžeme určit, má-li se případný obsah cache paměti použít, nebo má-li se URL znovu načíst.

NSURLClient

Nicméně načítat URL prostřednictvím služby resourceDataUsingCache: má jednu velkou nevýhodu – probíhá synchronně, takže celá aplikace čeká, až se data načtou (nebo až vyprší timeout v případě, že nejsou dosažitelná). To samozřejmě není pro použití v běžné aplikaci akceptovatelné: slušná aplikace v prostředí Mac OS X nemůže ze žádných příčin "přestat komunikovat s uživatelem".

Vývojové prostředí Cocoa ovšem samozřejmě myslí i na toto, a nabízí přímo v rámci třídy NSURL možnost načítání obsahu na pozadí – stačí implementovat potřebné služby neformálního protokolu NSURLClient, a použít zprávu loadResourceDataNotifyingClient:usingCache:. V nejjednodušším případě by to mohlo vypadat nějak takto:

@interface TestLoader:NSObject {
  NSURL *url;
}
@end
...
@implementation TestLoader
...
-(void)URLHandleResourceDidFinishLoading:(NSURLHandle*)sender {
  NSData *data=[url resourceDataUsingCache:YES];
  ... use data ...
}
-(void)loadDataFromURL:(NSURL)ur {
  [url autorelease];
  [url=[ur retain]
    loadResourceDataNotifyingClient:self usingCache:NO];
}
...
@end

Protokol NSURLClient nabízí další metody pro ohlášení chyby a podobně; neumožňuje však pohodlně zabezpečit řadu dalších služeb, jako třeba nastavení timeoutu. Proto si ukážeme novější způsob kterak načítat URL prostřednictvím dalších pomocných tříd – sice poněkud složitější, ale zato nabízející mnohem větší flexibilitu. To ale až zase příště...

.

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

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Tipy a Triky  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

 

 

 

 

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

Uživatelské jméno:

Heslo: