Kako bi bilo fenomenalno da networking framework automatski se pobrine za skupljanje odgovora za vas?

Kako bi bilo fenomenalno da networking framework automatski pamti vaše operacije kada je vaš klijent na mreži?

Vaš omiljeni tweet ili mark se čita direktno kada niste priključeni na mrežu, tj. Networking Framework ima sve ove funkcije kada se priključi nanovo na mrežu, bez dodatnog napora oko kodiranja. Predstavljamo vam MKNetworkKit.

 

Šta je to MKNetworkKit?

MKNetworkKit je networking framework napisan u Objective-C što nije od značaja, blok baziran, ARC spreman i lak za upotrebu.
MKNetworkKit su inspirisale dve druge popularne networking frameworks, ASIHTTPRequest i AFNetworking. Pored gore navedenih karakteristika, MKNetworkKit ima još mnogo dobrih osobina. Kao dodatak, MKNetworkKit mandat vas da napišete malo vie kodova nego što je drugi frameworks po ceni istog koda. Kod MKNetworkKit,teško je napisati ružan networking kod.

Karakteristike

Super neosetna težina

Ceo sastav ima 2 glavne karaketristike i neke metode kategorija. To znači da je usvajanje MKNetworkKit veoma lako.

Single Shared Queue za celu vašu aplikaciju.

Aplikacije koje zavise od Internet konekcije moraju da optimiziraju broj trenutnih operacija na mreži. nažalost, ne postoji networking framework koji to radi kako treba. Hajde da pogledamo šta može biti kako ne treba ako ne odradite optimize/control određeni broj puta kod vaše željene operacije kod aplikacije.

Hajde da pretpostavimo da prebacujete gomilu fotografija (na primer Color ili Batch) na vaš server. Većina mreža (3G) ne dozvoljava više od dve trenutne HTTP konekcije sa date HTTp adrese. To jeste, sa vašeg uređaja, ne možete otvoriti više d dve trenutne HTTP konekcije za 3G network. Još je gore na samoj ivici. Ne možete, u većini slučajeva, da otvorite više od jedne konekcije. Ovaj limit je veoma visok (šest) kod tradicionalnog broadband (Wifi). Ipak, pošto vaš iDevice nije uvek priključen na Wifi, morate biti pripremljeni za throttled/restricted network konekciju. U standardnim slučajevima iDeviceje uglavnom priključen na 3G mrežu, što znači da, ste ograničeni da prebacujete samo dve slike posebno. Sada, nije sporost samog prebacivanja ono što vam smeta. Pravi problem nastaje kada otvorite pogled koji prebacuje gomilu fotografija (različite vrste) dok operacija prebacivanja funkcioniše u pozadini. Ako ne možete da kontrolišete red kod vaših aplikacija, vaš će onda proces prebacivanja sličica da se sam raspoređuje što baš i nije željena operacija. Pravi način je da se odrede prioriteti ili da se sačeka prebacivanje nečega pa da se prebace sličice. To zahteva da imate jedisntveni red tokom cele aplikacije.MKNetworkKit vam to omogućava automatski koristeći jedinstveni red za svak pojedinačnu instancu. Dok MKNetworkKit nije sam po sebi kostur, red jeste.

Prikazivanje Network Activity Indicator ispravno

Sve dok imate mnogo trećih strana koje koriste “incrementing” i “decrementing” broj mreža poziva i koristi to da prkažu idikator mrežnih aktivnosti, MKNetworkKit se vraća na jedinstveni red i pokazuje indikator aktivnosti automatski kada se poreće neka funkcija koja radi u deljenom redu (KVO) kao na primer operationCount vlasništvo. kao programer, ne morate da brinete o podešavanju indikatora aktivnosti runo, nikada više.

    if (object == _sharedNetworkQueue && [keyPath isEqualToString:@"operationCount"]) {
 
        [UIApplication sharedApplication].networkActivityIndicatorVisible =
        ([_sharedNetworkQueue.operations count] > 0);
    }

Auto queue podešaanje veličine

Ako nastavimo prethodnu raspravu, rekao sam da većina pokretnih mreža ne dozvoljava više od dve trenutne konekcije. tako da vaš red bi treblo da je podešen na dva, kada je trenutna mrežna konekcija 3G. MKNetworkKit automatski to odrađuje za vas. Ako mreža padne na 3G/EDGE/GPRS, to menja broj trenutnih operacija koje mogu biti određene na 2. To se automatski menja na 6 kada se uređaj opet priključi na Wifi mrežu. Ako se ova tehnika pravilno koristi, videćete veliki boljitak kada prebacujete sličice (ili nekoliko manjih takvih zahteva) za foto biblioteku udaljenog servera preko 3G.

Auto keširanje

MKNetworkKitmože automatski da kešira “GET” zahteve. Ako ponovo podnesete zahtev, MKNetworkKit poziva vaš završetak sa keširanom verzijom kao odgovor (to je dostupno) skoro automatski. Takođe ponovo i zove udaljeni server. Kada se odredi datum servera, poziva se vaš nosač posla sa novim datumom. To znači da ne morate da se nosite sa ručnim keširanjem na vašoj strani. Sve što treba je pozivanje metoda,

[[MKNetworkEngine sharedEngine] useCache];

kao opcija, možete ponovo da ukucate metode na vašoj MKNetworkEngine pod lasi da bi ste podesili vaš direktorijum za keširanje i cenu memorijskog keširanja.

Operacija zamrzavanja

Pomoću MKNetworkKit, imate mogućnost zamrzavanja vaših mrežnih operacija. Ako dođe do gubitka konekcije, automatski dolazi do serilizacije i izvođenje se nsatavlja kada uređaj bude ponovo na mreži. Razmislite o “drafts” kod vašeg tviter klijenta.

Kada postavite tvit, imajte na umu da su mežni pozivi u mogućnosti da se zamrznu, i MKNetworkKit automatski brine o zamrzavanju i povraćaju zahteva za vas! tako da se tvitovi sami pošalju kasnije, a da vi ne morate da ukucavate nikakv dodatni kod. Možete ovo koristiti za operacije kao što je glavni tvit ili za deljenje postova na Google reader klijentu, dodavanje linkova za Instapaper i za slične operacije.

Izvođenje tačno jedne operacije za slične zahteve

Kada prebacite thumbnails (za twitter stream),možete završiti tako što ćete napraviti novi zahtev za svaku avatar fotgrafiju pojedinačno. Ali u stvarnosti, potrebno vam je toliko zahteva koliko ima jedinstvenih URL. Kod MKNetworkKit, svaki GET zahtev za red biva izbačen samo jednom. MKNetworkKit je inteligentan dovoljno da ne kešira “POST” http zahteve.

Keširanje fotografija

MKNetworkKit može bespotrebno biti korišćen za keširanje thumbnail imagesAko se pređe preko nekoliko metoda, možete podesiti onoliko fotografija koliko je to moguće a da se ne poremeti memorija keš metode, i da se direktorijum Caches sačuva na pravi način. Presnimavanje ovih metoda je sasvim opciono i na vama je da odlučite.

Izvođenje

Jedna reč. BRZINA. MKNetworkKit keširaenje je beznačajno. Funkcioniše kao NSCache, osim toga, kada postoji upozorenje o veličini memorije, in memorijsko keširanje je napisano u Caches direktorijumu.

Potpuna podrška Objective-C ARC

Vi obično odaberete nove okvire za nove projekte. MKNetworkKitnije namenjeno zameni postojećih okvira (iako to možete, veoma je naporno). Na novom projektu vi uvek i zaista želite da promenite ARC i na datum pisanja ovoga, MKNetworkKit je zapravo jedini okvir koji je u potpunosti spreman za ARC. ARC bazna memorija se rukovodi menadžmentom i obično na način sličan i brži nego non-ARC bazirana memorija i kod menadžmenta.

Kako se koristi

Ok, dosta sa samohvalom. Hajde da vidimo kako se ovaj okvir koristi.

Dodavanje MKNetworkKit

  1. Prevucite MKNetworkKit direktorijum u vaš projekat.
  2. Dodajte CFNetwork.Framework, SystemConfiguration.framework i Security.framework.
  3. Uključite MKNetworkKit.h za vaš PCH fajl
  4. Izbrišite NSAlert+MKNetworkKitAdditions.hfajl ako gradite za iOS.
  5. Izbrišite UIAlertView+MKNetworkKitAdditions.hfajl ako gradite za Mac.

Završili ste. Samo 5 ključnih fajlova i eto. Veoma moćan mrežni alat.

Klase kod MKNetworkKit

  1. MKNetworkOperation
  2. MKNetworkEngine
  3. Miscellaneous helper klase (Apple’s Reachability) i kategorije

Verujem u jednostavnost. Apple je uradio veliki napor za pisanje postojećeg koda. Ono što bi treća strana kod programiranja trebalo da obezbedi jeste opciono keširanje. Verujem, da bi bilo koja treća strana kod keširanja trebalo da ima ispod 10 klasa (bilo da je u pitanju mreža ili UIKitzamena ili bilo šta). Sve preko toga je suvišno. ta biblioteka 20 je priemr hvaljenja i isto tako je i ShareKit. Možda je to dobro. Ali je i dalje ogromno. ASIHttpRequest ili AFNetworkingsu lake i jednostavne, za razliku od RESTKit. JSONKitkoji nije lagan kao TouchJSON (ili bilo koja druga TouchCode biblioteka). Možda je to do mene, ali ne podnosim kad je više od trećine koda poređano kod aplikacije koja i dolazi od neke treće stane.

Problem kod velikih okvira jeste nerazumevanje unutrašnjeg rada i mogućnost podešavanja svega po vašim potrebama (ako vam to treba). Moji okviri (MKStoreKit za dodavanje In App Purchases vašeg app) su bili laki za korišćenje i verujem da MKNetworkKit će biti isto. Za korišćenje MKNetworkKit, sve što gtreba da znate je kako iskoristiti metode sa klasama MKNetworkOperation i MKNetworkEngine. MKNetworkOperation je sličan ASIHttpRequest klasi. To je pod klasa NSOperation i on zavija vaše zahteve i odgovore. napravite MKNetworkOperation za svaku mrežnu operaciju koji trebate kod vaše aplikacije.

MKNetworkEngineje pseudo-singleton klasa koja može da rukuje redom kod vaše aplikacije. To je pseudo-singleton, u smislu da bi trebalo da koristite MKNetworkEngine metodu direktno. Ako želite brzinu, onda morate da imate i podklase. Svaka MKNetworkEngine podklasa ima svoj sopstveni Reachability objekat koja vas obaveštava o serveru. trebalo bi da razmislite o pravljenu podklas MKNetworkEngine za svaki posebni REST server koji vidite. On je pseudo-singleton u smislu da bilo koji zahtev vezan za podklase ide kroz jedan i samo jedan red.

Možete da zadržite poredak MKNetworkEngine kod delegacije vaše aplikacije kao kod CoreData managedObjectContext klase. Kada koristite MKNetworkKit, pravite MKNetworkEngine podklasu kod lokalne grupe veše mreže. To znači da svi Yahoo odnosi podpadaju pod jednu klasu i sve Facebook metode u drugu klasu. Sada ćemo pogledati tri različita primera korišćenja okvira.

Primer 1:

Hajde da napravimo “YahooEngine” koji stvalja rate odnosa za Yahoo finasije.

Korak 1: napravite YahooEngine klasu kao podklasu MKNetworkEngine. MKNetworkEngine init metoda zahteva hostname i kalsično zaglavlje (ako ga ima). Zaglavlje je opciono i može biti - ništa. Sada napišete vaš sopstveni REST server za razliku od klase), možete i raumisliti o dodavanju aplikacije za klijente, neku drugu veerziju ili misc podatak koji klijent raspoznaje.

    NSMutableDictionary *headerFields = [NSMutableDictionary dictionary];
    [headerFields setValue:@"iOS" forKey:@"x-client-identifier"];
 
    self.engine = [[YahooEngine alloc] initWithHostName:@"download.finance.yahoo.com"
                       customHeaderFields:headerFields];

Imajte na umu da yahoo vas ne uslovljava da pošaljete x-client-identifieru zaglavlju, primer kod koji je gore prikazan je poslat smo kao primer ove karakteristike.

Pošto je potpuni kod ARC,vaš je zadatak kao programera da imate svoj (jake reference) Engine instance.

Kada napravite MKNetworkEngine podklasu, Reachability implementacija je urađena automatski za vas. To se dešava kada vam padne server ili zbog nekih drugh okolnosti se ne može pristupiti hostnamevaš zahtev će odmah biti zamrznut/u redu. Za više informacija o zamrzavanju pročotajte deo Freezing Operationskasnije na ovoj stranici.

Korak 2: Dizajniranje Engine klase (deljenje)

Hajde da pišemo metode kod Yahoo Engine da bi se došlo do promene. Promene kod mašine će biti pozvane za kontrolu. Dobra dizajnerska praksa je da se obezbedi da se vaša mašina ne eksponira ka URL/HTTPHeaders pa sve do pozvanih klasa. Vaš pogled ne bi trebalo da “zna” ništa o URL ili potrebnim parametrima. Ovo znači da parametri i metode kod vašeg Yahoo Engine bi trebalo da budu valute i brojevi mernih jedinica valute. Povratna vrednost metode može biti dvostruka koja je kod rate menjanja i može se takođe menjati i vreme za koje je pribavljena. Pošto ove operacije nisu sinhorizovane, vratićete te vrednosti kod bloka. Primer ovoga je

-(MKNetworkOperation*) currencyRateFor:(NSString*) sourceCurrency
                   	    inCurrency:(NSString*) targetCurrency
			  onCompletion:(CurrencyResponseBlock) completion
        	               onError:(ErrorBlock) error;

MKNetworkEngine,srodna klasa definiše tri tipa blok metoda kao što je prikazano dole.

typedef void (^ProgressBlock)(double progress);
typedef void (^ResponseBlock)(MKNetworkOperation* operation);
typedef void (^ErrorBlock)(NSError* error);

Kod vašeg YahooEngine, koristimo vrstu bloka CurrencyResponseBlock koji radi pod promenjivom ratom. Definicija izgleda ovako

typedef void (^CurrencyResponseBlock)(double rate);

kod bilo koje normalne aplikacije, trebalo bi da sami definišete blok metoda slično kao kod CurrencyResponseBlock za slanja nazad podataka kontrolorima.

Korak 3: Procesuiranje podataka
Procesuiranje podataka, za podatke sa vašeg servera, bilo da su u pitanju JSON ili XML ili binar plist, trebalo bi da odradi Engine. ipak, oslobodite kontrolore ovog zadatka. vaš motor bi trebalo da je šalje podatke nazad samo kao odgovarajući oblik objekta i strelica modelnog objekta (u slučaju liste). Prebacite JSON/XML u model kod motora. Opet, ako želite da obezbedite podelu zabrinutosti, vaš kontrolor ne bi trebalo da “zna” ništa o “ključevima” za pristup individualnim elementima kod JSON.

Tu završavamo dizajn vašeg Engine. Većina okvira ne trea vas da sledite ovu podelu zabrinutsti. Mi da, zato što brinemo za vas :)

Korak 4: Metoda implementacije
sada ćemo raspravljati o implementaciji detalja metode koja vrši kalkulaciju vaše trenutne promene.

Ako dobijete informacije o valuti sa Yahoo, to je jednostavno kao GET zahtev.
Ako dobijete informacije o valuti sa Yahoo, to je jednostavno kao GET zahtev. Napisao sam makro format ovog URL za određeni par valute.

#define YAHOO_URL(__C1__, __C2__) [NSString stringWithFormat:@"d/quotes.csv?e=.csv&f=sl1d1t1&s=%@%@=X", __C1__, __C2__]

Metode koje pišete kod vaše klase mašine bi trebalo da budu sledećim redom.

  1. Pripremite vaš URLsa parametrma.
  2. Napravite MKNetworkOperation objekat sa zahtevom.
  3. Postavite parametre metode.
  4. Dodajte i moguća rešenja u slučaju greške (Kompletiranje je mesto za procesuiranje vaših zahteva i prebacivanje u Models.)
  5. Kao opciju, dodajte merač progresa operaciji (ili uradite ovo sa pregledačem)
  6. Ako je vaša operacija prebacivanje fajla, podesite nit prebacivanja (obično fajla) na to. Ovo je takođe kao opcija.
  7. Kada se operacija završi, procesuirajte rezultat i blokirajte metodu povratnih podataka.

Ovo je prikazano kod sledećeg koda

        MKNetworkOperation *op = [self operationWithPath:YAHOO_URL(sourceCurrency, targetCurrency)
                                                  params:nil
                                             httpMethod:@"GET"];
 
    [op onCompletion:^(MKNetworkOperation *completedOperation)
     {
         DLog(@"%@", [completedOperation responseString]);
 
		 // do your processing here
         completionBlock(5.0f);
 
     }onError:^(NSError* error) {
 
         errorBlock(error);
     }];
 
    [self enqueueOperation:op];
 
    return op;

Gornji kod formatira URL ai stvara MKNetworkOperation. nakon podešavanja završnice operacija se stavlja u red tako šro se pozove super klasna enqueueOperation metoda i dodaju se povratne reference. vaš kontrolor prometa bi trebalo da prati ove operacije i da ih ugasi kada vidi da se došlo do neke hijerehije. Tako da metodu motorapozivate kod na primer viewDidAppear, operaciju otkazujete kod viewWillDisappear. osloboditi red za odvijanje nekih drugih operacija koje su na redu (Zapamtite, samo dve paralelne operacije mogu da se odvijaju kod mobilnih mreža. Otkazivanje operacija kada više nisu potrebne ide do kraja i ubrzava vašu aplikaciju).

Vaš kontrolor prometa može takođe da (opciono) dodat i nosač prometa i da ažurira interfejs. Ovo je prikazano malo niže.

    [self.uploadOperation onUploadProgressChanged:^(double progress) {
 
        DLog(@"%.2f", progress*100.0);
        self.uploadProgessBar.progress = progress;
    }];

MKNetworkEngine ima takođe zgodnu metodu kreiranja operacija sa samo jednim URL. Tako da prva linija kod može biti napisana ovako

        MKNetworkOperation *op = [self operationWithPath:YAHOO_URL(sourceCurrency, targetCurrency)];

Vidite da zahtev URL jeste automatski sa prefiskom i sa hostname koje vi imate dok inicirate klasu motora.

Napravite POST, DELETE ili PUT metodu lako kao promenu httpMethod parametara. MKNetworkEngine ima više sličnih metoda kao što je ova.pročitajte faj u zaglavlju za više informacija.

Primer 2:

Prebacite sliku na server (TwitPic na primer).
Hajde da prođemo kroz primer kako bi trebalo prebacivati sliku na server. Prebacivanje fotografije zahteva da operacija bude kodirana više puta. MKNetworkKit prati obrazac sličan ASIHttpRequest.
Tražite metodu addFile:forKey: kod MKNetworkOperation da bi “attach” fajl za višebrojno deljenje podatak po vašem zahtevu. tako je lako.
MKNetworkOperation takođe ima zgodnu metodu dodavanja fotografija na NSData pointer. To možete nazvati addData:forKey: metoda prebacivanja fotografija na vaš server direktno sa NSData pointera. (Razmislite o direktnom prebacivanju fotografija sa fotoaparata).

Primer 3:

Prebacivanje fajlova u lokalni direktorijum (Keširanje)
Prebacivanje fajlova na udaljeni server sa lokacije korisnika iPhone, što je veoma lako sa MKNetworkKit.
Samo podesite outputStream MKNetworkOperation i sve ste završili.

[operation setDownloadStream:[NSOutputStream
	outputStreamToFileAtPath:@"/Users/mugunth/Desktop/DownloadedFile.pdf"
			  append:YES]];

Možete podesiti više opcija za samo jednu operaciju da bi ste isti fajl kasnije sačuvali na više različitih lokacija (Npr jedan u vaš direktorijum za keširanje i jedan u vaš radni direktorijum).

Primer 4:

Image Thumbnail keširanje
Za prebacivanje fotografija, trebalo bi da imate aplosulti URL pre nego samo niz. MKNetworkEngine ima jednostavnu operaciju za ovo. Samo pozovite operationWithURLString:params:httpMethod:za kreoranje mrežne operacije sa apsolutnim URL.
MKNetworkEngine je inteligentan. Ima mnogobrojne GETpozive istom URL u jedan, a onda obaveštava sve blokove kada je operacija gotova. Ovo u mnogome poboljšava brzinu skupljanja informacija za popularn URLi poboljšanje thumbnails.

Podklase MKNetworkEngine i druge fotografije u direktorijumu keširanja i po ceni odgovarajućeg keširanja. Ako ne želite da ova dva odomaćite, možete direktno da pozovete MKNetworkEngine metodu i da prebacite fotografiju za vas. U stvari, ja bih vam preporučio da to uradite.

Operacije keširanja

MKNetworkKit kešira sve zahteve standardno. Sve što treba da uradite jeste da uključite keširanje za vaš motor Engine. Kada se izvodi GET zahtev, ako je odgovor prethodno keširan, vaš nosač rada se poziva sa keširanim odgovorom skoro pa automatski. Ako želite da znate da li je odgovor keširan, koristite isCachedResponse metodu. To je ovde prikazano

    [op onCompletion:^(MKNetworkOperation *completedOperation)
     {
         if([completedOperation isCachedResponse]) {
             DLog(@"Data from cache");
         }
         else {
             DLog(@"Data from server");
         }
 
         DLog(@"%@", [completedOperation responseString]);
     }onError:^(NSError* error) {
 
         errorBlock(error);
     }];

Operacije zamrzavanja

Možemo razmatrati o tome da li je najinteresantnija karakteristika MKNetworkKit operacija zamrzavanja. Sve što treba da uradite jeste da podesite opciju zamrzavanja. Nemata ama baš nikakav napor!

[op setFreezable:YES];

Opcije zamrzavanja se odmah same razbiraju kada mreža padne i izvršavaju se na dalje kada se ponovo uspostavi konekcija. razmislite o mogućnosti da se favorizuje tvit dok ste van mreže, a operacija se onda stvarno odradi čim se opet priključite
Zamrznute operacije su na disku kada sama aplikacija uđe u pozadinu. Odmah će se izvršiti kada se ponovo aplikacija povrati.

Korisne metode kod MKNetworkOperation

MKNetworkOperation ima zgodne metode kao što su sledeće da bi se došlo do željenog formata vašg podatka.

  1. responseData
  2. responseString
  3. responseJSON (Only on iOS 5)
  4. responseImage
  5. responseXML
  6. greška

Ove opcije su veoma zgodne kada je u pitanju odgovor kada se sve operacije na mreži završe. Kada je format pogrešan, ove opcije se vraćaju kao nulte. Na primer, pokušajte da priđete responseImage kada je stvarni odgovor HTML, onda će se odgovor vratiti kao nula. Ovoj je jedini metod koji vam garantuje da će se sve korektno vratiti, a odgovor se očekuje kod responseData. Ako ste sigurni u vrstu odgovora koristite onda slobodno i druge metode.

Korisni macros

Ti macros, DLog i ALogsu beskrupulozno su ukradeni od Stackoverflow i opet mogu pronaći izvor. Ako to napišete javite mi.

Primedba za GCD

Naročito nisam koristio GCD jer se operacije na mreži moraju zaustaviti i moraju se odrediti prioriteti. GCD, iako je efikasniji od NSOperationQueue, ne može to da uradi. Preporučio bih da ne koristite GCD baziran na redovima kao deo vaše mrežne operacije.

Dokumentacija

Fajlovima se komanduje, a ja sada isprobavam headerdoc za Apple. U međuvremenu, možete koristiti use/play sa se kodom (čitajte: Fork).

Izvorni kod

Izvorni kod za MKNetworkKitzajedno sa demo aplikacijom je dostupan na Github.
MKNetworkKit on Github

Karakterni zahtevi

Nemojte mi molim vas slati zahteve sa različitim karalteristikama. Najbolji način jeste da create an issue on Github.

Licenciranje

MKNetworkKit isje licenciran pod MIT License

Svi moji izvorni kodovi se mogu koristiti besplatno kod vaših aplikacija, ako ubacite copyright obaveštenje u apliakciju. Dovoljno će biti da ubacite i jedno malo “o” na najtamnijem delu vaše stranice.