Consuming REST JSON services from the iPhone

  • 5,975 views
Uploaded on

La sessione descrive lo sviluppo di un piccolo client per Twitter, con Objective-C e Cocoa Touch. Sono presentate delle soluzioni generiche e riutilizzabili per: …

La sessione descrive lo sviluppo di un piccolo client per Twitter, con Objective-C e Cocoa Touch. Sono presentate delle soluzioni generiche e riutilizzabili per:
1) Invocare servizi REST remoti
2) Fare il parse di risultati JSON
3) Rendere asincrona l'esecuzione di un qualsiasi metodo

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
5,975
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide














Transcript

  • 1. Consuming REST services from the iPhone Marco Bellinaso Blog: www.marcobellinaso.com Company: www.getconnected.it Email: marco.bellinaso@getconnected.it Twitter: mbellinaso www.getconnected.it / info@getconnected.it
  • 2. Cosa fa GetConnected? • Consulenza e sviluppo custom per iPhone, BlackBerry, Android e WinMobile (ma anche tanto web :) • Analisi e studio di fattibilità per progetti innovativi • Sviluppo di proprie applicazioni attraverso il brand AnguriaLab.com • Locomotimes & Locomotimes PRO (45.000+ download) • Postino (distribuzione worldwide / 40.000+ download) • versione per iPhone + WinMobile + Facebook • More coming soon... ;) www.getconnected.it / info@getconnected.it
  • 3. Postino & Locomotimes www.angurialab.com www.getconnected.it / info@getconnected.it
  • 4. Cosa vedremo? • Sviluppiamo un mini client per Twitter • Cosa ci serve? (1) effettuare chiamate HTTP (2) fare il parsing di testo JSON restituito (3) rendere asincrona la chiamata HTTP (o una qualsiasi chiamata / elaborazione!) www.getconnected.it / info@getconnected.it
  • 5. Effettuare chiamate HTTP + (NSString *)getStringFrom:(NSString *)resource usingVerb:(NSString *)verb withParams:(NSObject *)parameters headers:(NSDictionary *)headers { NSURL *url = [NSURL URLWithString:resource]; // create the dictionary for the custom headers... NSMutableDictionary *reqHeaders = [[NSMutableDictionary alloc] init]; // ... // create the body from the input parameters NSData *body = [(NSString *)parameters dataUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; [request setHTTPMethod:verb]; [request setAllHTTPHeaderFields:reqHeaders]; NSURLResponse *response = [[NSURLResponse alloc] init]; NSError *error = [[NSError alloc] init]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (error) return nil; return [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; } www.getconnected.it / info@getconnected.it
  • 6. Parsing del JSON (1/2) Semplicissimo, basta usare json-framework (http://code.google.com/p/json-framework/) http://api.twitter.com/1/statuses/user_timeline/mbellinaso.json [ { "created_at":"Sun Apr 11 20:23:47 +0000 2010", "text":"after yesterday's sample app, now it's time to write the slides..." ... }, { "created_at":"Sat Apr 10 14:38:54 +0000 2010", "text":"just developed a small Twitter client as a sample for..." ... }, ... ] www.getconnected.it / info@getconnected.it
  • 7. Parsing del JSON (2/2) NSString *url = @"http://api.twitter.com/1/statuses/user_timeline/mbellinaso.json"; NSString *retJson = [NetworkHelper getStringFrom:url usingVerb:kVerb_GET withParams:nil headers:nil]; NSArray *rawTweets = [retJson JSONValue]; // parse the json and build an array of Tweet objects NSMutableArray *tweets = [NSMutableArray arrayWithCapacity:[rawTweets count]]; for (NSDictionary *rawTweet in rawTweets) { Tweet *tweet = [[Tweet alloc] init]; tweet.text = [rawTweet objectForKey:@"text"]; [tweet setDatetimeFromString:[rawTweet objectForKey:@"created_at"]]; [tweets addObject:tweet]; [tweet release]; } www.getconnected.it / info@getconnected.it
  • 8. Chiamate HTTP asincrone responseData = [[NSMutableData data] retain]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; - (void)connection:(NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response { [responseData setLength:0]; } - (void)connection:(NSURLConnection *)connection didReceiveData: (NSData *)data { [responseData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; // use the returned string... } www.getconnected.it / info@getconnected.it
  • 9. Soluzione generica per async calls (1/4) • NSURLConnection ha il suo metodo per effettuare la chiamata asincrona...ma non è sempre così! • C’è una soluzione generica? SI • Definisco un oggetto che deriva da NSOperation, e all’interno del suo metodo main scrivo il codice che verrà eseguito su un altro thread. Come ultima istruzione di main chiamo un metodo di callback sul thread principale • Creo un’istanza della sottoclasse di NSOperation e la inserisco all’interno di una NSOperationQueue le operazioni messe in coda vengono eseguite in maniera asincrona e al loro termine viene chiamato il metodo di callback definito www.getconnected.it / info@getconnected.it
  • 10. Soluzione generica per async calls (2/4) _sharedOperationQueue = [[NSOperationQueue alloc] init]; AsyncOperation *op = [[[AsyncOperation alloc] initWithTargetInstance:self targetMethod:@selector(loadTweetsForAccount:) parameter:account callbackInstance:self callbackMethod:@selector(loadTweetsComplete:)]; [_sharedOperationQueue addOperation:op]; - (NSArray *)loadTweetsForAccount:(NSString *)account { // retrieve the tweets JSON with a sync HTTP call // ... // parse the json and build an array of Tweet objects NSMutableArray *tweets = [NSMutableArray arrayWithCapacity:[rawTweets count]]; // ... return tweets; } - (void)loadTweetsComplete:(NSArray *)tweets { self.tweets = tweets; [self.tweetsTable reloadData]; } www.getconnected.it / info@getconnected.it
  • 11. Soluzione generica per async calls (3/4) @interface AsyncOperation : NSOperation { ... } @property (assign, nonatomic) Class targetClass; @property (retain, nonatomic) NSObject *targetInstance; @property (assign, nonatomic) SEL targetMethod; @property (retain, nonatomic) NSObject *callbackInstance; @property (assign, nonatomic) SEL callbackMethod; @property (retain, nonatomic) NSObject *parameter; // methods to initialize the object... - (id)initWithTargetInstance:(NSObject *)tInstance targetMethod:(SEL)tMethod parameter:(NSObject *)param callbackInstance:(NSObject *)cInstance callbackMethod:(SEL)cMethod; // more variations... @end www.getconnected.it / info@getconnected.it
  • 12. Soluzione generica per async calls (4/4) @implementation AsyncOperation - (void)main { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSObject *ret = nil; if (self.targetInstance) { ret = [self.targetInstance performSelector:self.targetMethod withObject:self.parameter]; } else ret = [self.targetClass performSelector:self.targetMethod withObject:self.parameter]; if ([self.callbackInstance respondsToSelector:self.callbackMethod]) { [self.callbackInstance performSelectorOnMainThread:self.callbackMethod withObject:(self.parameter ? ret : nil) waitUntilDone:YES]; } [pool release]; } // ... @end www.getconnected.it / info@getconnected.it
  • 13. Altre risorse ASIHTTPRequest http://allseeing-i.com/ASIHTTPRequest/ Framework per la gestione semplificata di download e upload. Supporta: • chiamate asincrone • operazioni multiple parallele • autenticazione basic, digest e NTLM • bandwidth throttling • gestione automatica di una progress bar • delegate per gli eventi di progresso www.getconnected.it / info@getconnected.it
  • 14. Domande? marco.bellinaso@getconnected.it www.getconnected.it / info@getconnected.it