På et tidspunkt i din iOS-utviklingskarriere vil du ha behov for å samhandle med en webtjeneste fra din app. Du må kanskje få tilgang til eksterne data, analysere et sosialt nettverk, eller til og med laste ned noen ressurser i søknaden din. Dette raske tipset lærer deg å gjøre det uten å bruke tredjepartsbiblioteker!
Det er noen fantastiske tredjepartsbiblioteker der ute for å bidra til å lette interaksjoner på webtjenesten, inkludert ASIHTTPRequest, AFNetworking og RESTKit. Mens disse bibliotekene er utrolig nyttige, noen ganger er de litt overkill. De legger til ganske mye unødvendig kodeoppblåsing til en app via ekstra variabler i minnet, og endrer også arbeidsflyten din for å tilpasse seg arbeidsflyten i hvert bibliotek.
Jeg pleide å bruke noen av disse bibliotekene (og mer!) Som en krykke. Jeg følte å bruke dem sped opp utviklingstid og redusert kompleksitet. Selv om dette er sant i mange tilfeller, er disse ikke "en størrelse som passer alle løsninger". I tillegg legger du til kompleksitet med mindre du forstår alt under hylen til disse bibliotekene.
I dag skal jeg vise deg en mye enklere tilnærming til grensesnitt med webtjenester og nedlasting av data fra nettet. Jeg har nylig brukt denne tilnærmingen i min nye iOS MUD klient Pocket MUD Pro for å hente ekstern lyd, innstillinger og data. Denne tilnærmingen innebærer bruk av "innebygde" teknologier for nedlasting, analyse og bruk av ekstern JSON, samt eiendeler som bilder og lyder.
I iOS-versjoner før 4 var det ganske vondt å hente data asynkront. Du måtte vanligvis lage en fullblåst klasse dedikert til å stille forespørsler og deretter en annen til å analysere og bruke svarene. Med Grand Central Dispatch (GCD), kan du nå gjøre dette inline og holde koden kort og ren. Her ser du noen kode som henter et eksternt JSON-dokument fra nettet:
dispatch_queue_t queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); forsendelsen (syn stringWithContentsOfURL: url koding: NSASCIIStringEncoding error: & error]; NSLog (@ "\ nJSON:% @ \ n Feil:% @", json, feil););
Denne koden starter ved å hente en av Apples tre sendekøer som du kan bruke til asynkron kjøring, og kjører en blokk i køen med standardprioritet. Du kan like lett ha skapt din egen kø. Uansett, dette tillater at vår kode kjøres i en egen tråd fra hovedtråden gjennom kraften til Grand Central Dispatch (GCD).
Vi bygger deretter nettadressen og holder den inn i stringWithContentsOfURL: koding: error:
Metode for NSString for å hente JSON-dataene. Endelig blir returstrengen skrevet ut sammen med feilen (hvis det er en).
Denne tilnærmingen er veldig rask, men gir deg ikke mye kontroll. Selv om du vet hva en feil kan være, kan du ikke spesifisere en timeout i tilfelle en feil. Standard timeout er et sted rundt 30 sekunder. Hvis du vil ha litt ekstra kontroll over timeout og så, må du erstatte strengmetoden med en NSURLConnection.
Som i iOS 5 har Apple en innebygd JSON-parser som lar deg ta en streng som inneholder JSON og konvertere den til en NSDictionary eller en NSArray. For å analysere og bruke JSON som returneres i koden ovenfor, legg til disse linjene før slutten av blokken:
hvis (! feil) NSData * jsonData = [json dataUsingEncoding: NSASCIIStringEncoding]; NSDictionary * jsonDict = [NSJSONSerialization JSONObjectWithData: jsonData alternativer: kNilOptions feil: & error]; NSLog (@ "JSON:% @", jsonDict);
De NSJSONSerialization
klassen vil analysere og konvertere en JSON-streng til en NSDictionary eller NSArray avhengig av formatet til JSON. Dette gjør livet ditt mye, mye lettere. Nå kan du bruke verdiene fra JSON-strengen som denne:
NSString * promo_url = [jsonDict objectForKey: @ "promo_url"];
Og der har du det! En veldig enkel måte å konsumere webtjenester ved hjelp av bare innfødte SDK-klasser. Nå, til noe litt mer interessant ... bilder!
Vi kan bruke metoden beskrevet ovenfor for å hente noen form for ekstern media. For dette eksempelet vil jeg vise deg hvordan du laster ned et bilde fra den populære bloggen XKCD.
dispatch_queue_t img_queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async (img_queue, ^ NSURL * url = [NSURL URLWithString: @ "http://imgs.xkcd.com/comics/formal_logic.png"]; NSError * error = null; NSData * image = [NSData dataWithContentsOfURL: url opsjoner : 0 feil: & feil]; hvis (! Feil && bilde && [bilde lengde]> 0) NSArray * stier = NSSearchPathForDirectoriesInDomains (NSCachesDirectory, NSUserDomainMask, YES); NSString * path = [[stier objectAtIndex: 0] stringByAppendingPathComponent: @ " image.png "]; [bilde writeToFile: banealternativer: 0 feil: & feil];
Igjen begynner vi med å få en kø til å kjøre asynkront på. Deretter henter vi bildedataene ved hjelp av dataWithContentsOfURL: alternativer: error:
metode for NSData. Når vi bekrefter at vi har returnert noen data, tar vi en referanse til katalogen caches på disk og lagrer bildet.
Og det er så enkelt! Du kan også bruke det hentede bildet med en gang ved å gjøre dette:
Ullmage * img = [UIImage imageWithData: image];
Jeg håper denne artikkelen har hjulpet deg med å fjerne krykken på tredjepartsbiblioteker for å kunne kommunisere med nettet. Du burde nå ha kunnskapen til å lage et fullt blown webapplikasjon. Hvis du har spørsmål eller kommentarer, vennligst la dem være her eller skriv meg på Twitter.
Glad koding!