Opplæring i iOS, del 2: Opprette en webtjeneste

La oss endre de Flickr-baserte API-anropene fra vårt forrige prosjekt før vi går i gang med å opprette en webtjeneste for å se på en annen webtjeneste. Vi vil utforske en mer kompleks respons, som vil sette oss opp for kjøttet i denne opplæringen: lage vår egen webtjeneste og samhandle med den.

Det grunnleggende er fortsatt det samme i de fleste webtjenester. For dette eksempelet valgte jeg en værtjeneste fra World Weather Online og brukte gratis API (det er også en betalt tjeneste). Etter at du har logget deg på kontoen din, går du til API Utforsker. Velg API for gratis vær fra rullegardinmenyen og klikk på Få lokalt vær ( figur A ).

Figur A

Når du klikker på Get-knappen til venstre for Local Weather, utvides den for å vise alternativene Get HTTP-forespørselen din kan ha. La verdiene være som de er og klikk på Prøv det! knappen nederst. Du bør få det du ser i figur B.

Figur B

Dette er i utgangspunktet å fortelle oss hva API-forespørselen skal være - det vil si Request Uniform Resource Identifier (URI). Kopier den lenken og lim den inn i et nettleservindu. Du bør få en haug med tekst som starter slik:

 {"data": {"current_condition" 

Dette returnerer en JSON-ordbok, som du nå må analysere. La oss ta denne URI og legge den i vår forrige Flickr-app der Flickr-URL tidligere var. Koden din vil se slik ut:

 - (void) viewDidLoad {super viewDidLoad; NSURL * myURL = NSURL URLWithString: @ "http://api.worldweatheronline.com/free/v1/weather.ashx?q=London&format=json&num_of_days=5&key=xfanay7rjhsfe6ays8w3xfza"; NSURLRequest * myRequest = NSURLRequest requestWithURL: myURL; NSURLConnection * myConnection = NSURLConnection connectionWithRequest: myRequest delegat: self; } 

Kjør appen din. Det vil krasje, fordi vi fortsatt prøver å analysere våre nye data med vårt gamle skjema eller struktur. Hvis du hadde en NSLog for flickrDiction-en i forbindelsen din: didReceiveResponse-metoden, legg til et knekkpunkt på den linjen eller like etter den - dette vil stoppe programutførelsen på den linjen og la deg se NSLog før appen krasjer. (Breakpoints må aktiveres for at utførelsen skal stoppe ved hvert breakpoint.) Du kan også la det krasje og se i konsollen; det mottatte svaret vil fremdeles logges der.

Tanken er å se hvordan den nye svarordboken ser ut for å restrukturere våre tabellvisningsmetoder for å håndtere det nye skjemaet. Hvis du ser på linjen som logger strengen, ser den ut som uleselig kode; Hvis du logger ordboken, kan du imidlertid se strukturen på en tydeligere måte. Det nye skjemaet ser noe slik ut:

1) data

en. nåværende tilstand

Jeg. en haug med parametere som cloudcover

b. be om

c. vær

Jeg. dato i 5 dager siden det er verdien vi valgte

Nå kommer litt tankeprosessering som vil føre til at du stoler på hjernen din. Vi har en dataordbok med tre oppføringer. Vi vil ha data fra den første oppføringen som heter "aktuell_condition" - spesifikt, vi vil ha "weatherDesc" -nøkkelen, så "data.current_condition.weatherDesc" er den grenen vi ønsker å nå. Min måte å gjøre det på vil introdusere deg en metode som heter isKindOfClass.

Vi vet at vår flickrDiction er en NSDiction fordi jeg ba deg om å bruke det objektet, men la oss virkelig teste det. Legg til disse linjene under NSLog flickrDictionline:

 // test if (flickrDiction isKindOfClass: NSDictionary class) {NSLog (@ "Yup, it is a dictionary okay!"); } 

Kjør appen din og sjekk konsollen for den teksten. En rask og enkel måte å gjøre det på, spesielt når du har mange ting å logge på konsollen, er å bruke konsollens Find-funksjon. Etter at appen krasjer eller stopper ved knekkpunktet, klikker du på innsiden av konsollen for å forsikre deg om at søkesøylinjen åpnes for den og ikke for redigeringsvinduet på toppen; Klikk deretter Cmd + F for å åpne søkefeltet øverst til høyre. Kopier og lim inn teksten.

Så du vet at det er en ordbok - big whoop, ikke sant? Hvis flickrDiction er en ordbok, må den inneholde oppføringer. En oppføring du ser i begynnelsen er "data", så la oss skaffe objektets nøkkel og logge den. Bytt ut // testkodeblokken din med denne:

 // test if (flickrDictionary isKindOfClass: NSDictionary class) {id object = flickrDictionary valueForKey: @ "data"; if (object isKindOfClass: NSDictionary class) {NSLog (@ "Again!"); }} 

Vi tok ordbokens dataregistrering (som vi kunne se i konsollen) og la den inn i et id-type-objekt; dette betyr at det er et objekt av ukjent type. Deretter tester vi om det objektet er en ordbok. Kjør appen og finn den loggede teksten. La oss se etter den neste oppføringen, "nåværende_condition":

 // test if (flickrDictionary isKindOfClass: NSDictionary class) {id object = flickrDictionary valueForKey: @ "data"; if (object isKindOfClass: NSDictionary class) {id anotherObject = object valueForKey: @ "current_condition"; if (anotherObject isKindOfClass: NSDictionary class) {NSLog (@ "OMG!"); }}} 

Kjør den igjen. Du kunne ikke finne "OMG!" tekst, kunne du? Det er fordi det neste objektet ikke er en ordbok. Bytt ut NSDictionary-klassen for NSArray-klassen i den siste hvis du tester og sjekk konsollen igjen. Dette er en praktisk måte å teste på ukjente objekter på. Webtjenester er beryktet for å returnere JSON-strenger, som ikke er veldig lesbare av mennesker. Husk: Det er alltid godt å teste.

Nå har vi et utvalg inne i "gjeldende_condition" -oppføringen. En måte å skille dem fra hverandre er at ordbøker starter med en "{" krøllete stag, mens matriser begynner med en "(" eller "". Så dette objektet i "current_condition" er en matrise, som har objekter på visse indekser i stedet for verdier eller objekter for nøkler. For å få vårt første objekt fra den arrayen, vil vi gjøre dette:

 if (flickrDictionary isKindOfClass: NSDictionary class) {id object = flickrDictionary valueForKey: @ "data"; if (object isKindOfClass: NSDictionary class) {id anotherObject = object valueForKey: @ "current_condition"; if (anotherObject isKindOfClass: NSArray class) {id firstArrayObject = anotherObject objectAtIndex: 0; if (firstArrayObject isKindOfClass: NSDictionary class) {NSLog (@ "Jeg kan ikke ta dette lenger"); }}}} 

Kjør den og finn teksten din. Nå begynner vi å få en følelse av hvordan et kjøttfullt respons ser ut.

Vi vil gjerne få verdien for weatherDesc, som er en oppføring i denne nye ordboken. Men weatherDesc's verdi er en annen gruppe med en ordbok i indeksen: 0, som i seg selv har en ordbok som bare består av en oppføring kalt "verdi". Det er den vi ønsker, og slik får vi det til:

 // test if (flickrDictionary isKindOfClass: NSDictionary class) {id object = flickrDictionary valueForKey: @ "data"; if (object isKindOfClass: NSDictionary class) {id anotherObject = object valueForKey: @ "current_condition"; if (anotherObject isKindOfClass: NSArray class) {id firstArrayObject = anotherObject objectAtIndex: 0; if (firstArrayObject isKindOfClass: NSDictionary class) {NSLog (@ "value is% @", firstArrayObject objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ "value"); }}}} 

Hvis vi skulle få verdien i ett fall, ville det sett slik ut:

 NSLog (@ "verdi er% @", flickrDiktionary valueForKey: @ "data" objectForKey: @ "current_condition" objectAtIndex: 0 objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ " verdi"); 

Nå har vi verdien for dagens (nåværende tilstand) vær: "Klart". (Det hadde vært mye enklere å bare åpne vinduet, ikke sant?) La oss lage en mutbar matrise for å sette "Clear" verdien i den. Hvis du bruker det gamle prosjektet som utgangspunkt, har du en NSMutableArray kalt cFRAIPArray allerede der som en ivar. La oss ta vår "klare" verdi og legge den inne:

 NSString * Today = flickrDictionary valueForKey: @ "data" objectForKey: @ "current_condition" objectAtIndex: 0 objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ "value"; cFRAIPArray addObject: i dag; 

La oss få prognosene for de neste fem dagene. Hvis du ser på den loggede flickrDiction-enheten i konsollen, vil du se at på samme hierarkiske nivå som current_condition, har du en ordbok som heter "vær"; innholdet ligger i en rekke med mange objekter, som hver tilsvarer en annen dag. Så oversatt til kode heter den neste verdien vi trenger:

 NSString * i morgen = flickrDictionary valueForKey: @ "data" objectForKey: @ "weather" objectAtIndex: 0 objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ "value"; NSLog (@ "i morgen blir% @", i morgen); 

Løp og finn i morgen i konsollen. Nå kan vi legge dette til i vår cFRAIPArray og få de neste tre dagene. Husk at URI-enheten vår som er kalt i 5 dager og dag 1 er aktuell_tilstand, så vår komplette metode vil se slik ut:

 - (ugyldig) tilkobling: (NSURLConnection *) tilkobling didReceiveData: (NSData *) data {NSLog (@ "data er% @", data); NSString * myString = NSString alloc initWithData: datakoding: NSUTF8StringEncoding; NSLog (@ "streng er% @", myString); NSError * e = null; flickrDictionary = NSJSONSerialization JSONObjectWithData: dataalternativer: NSJSONReadingMutableContainers error: & e; NSLog (@ "ordbok er% @", flickrDictionary); // Init array cFRAIPArray = NSMutableArray alloc initWithCapacity: 6; // DAY1 NSString * i dag = flickrDiktionary valueForKey: @ "data" objectForKey: @ "current_condition" objectAtIndex: 0 objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ "value" ; cFRAIPArray addObject: i dag; // DAY2 NSString * i morgen = flickrDiktionary valueForKey: @ "data" objectForKey: @ "weather" objectAtIndex: 0 objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ "value" ; cFRAIPArray addObject: morgendag; // DAY3 NSString * afterTomorrow = flickrDictions valueForKey: @ "data" objectForKey: @ "weather" objectAtIndex: 0 objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ "value" ; cFRAIPArray addObject: afterTomorrow; // DAY4 NSString * neste = flickrDiktionary valueForKey: @ "data" objectForKey: @ "weather" objectAtIndex: 0 objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ "value" ; cFRAIPArray addObject: neste; // DAY5 NSString * afterThat = flickrDictions valueForKey: @ "data" objectForKey: @ "weather" objectAtIndex: 0 objectForKey: @ "weatherDesc" objectAtIndex: 0 objectForKey: @ "value" ; cFRAIPArray addObject: afterThat; NSLog (@ "cFRAIPArray er% @", cFRAIPArray); } 

Dette gir en fin rekke med værforholdene for de neste fem dagene på dette stedet. La oss fjerne noen gamle koder vi hadde i forbindelseDidFinishLading og la den være ren, slik:

 - (void) connectionDidFinishLoading: (NSURLConnection *) -forbindelse {// gjør noe med dataene // mottattData er erklært som en metodeforekomst andre steder NSLog (@ "Lyktes!"); self.tableView reloadData; } 

Vi kan gjøre dette fordi vi har all vår array-lastingskode i tilkoblingen: didReceiveData. Når dette lastes inn og endelig når tilkoblingenDidFinishLoading, kalles tabellvisningens omlastingData-metode for å oppdatere visningen med de ferdige dataene.

© Copyright 2020 | mobilegn.com