{"id":3520,"date":"2010-05-30T11:35:19","date_gmt":"2010-05-30T09:35:19","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=3520"},"modified":"2010-11-05T16:43:44","modified_gmt":"2010-11-05T15:43:44","slug":"t047-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-2","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t047-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-2\/","title":{"rendered":"T#047 \u2013 Accedere a Flickr dalle nostre applicazioni iPhone (parte 2)"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/logo_flickr.jpg\" alt=\"\" width=\"223\" height=\"111\" \/><\/p>\n<p>Ed eccocci alla seconda parte di questo tutorial, oggi inizieremo finalmente a scrivere un p\u00f2 di codice.<\/p>\n<p>Facciamo il punto della situazione, nella prima parte di questa guida abbiamo imparato che per ottenere il file xml contente tutte le info riguardanti le foto che vogliamo scaricare bisogna fare una chiamata http verso un particolare indirizzo. Una volta ottenuto questo file xml bisogner\u00e0 poi analizzarlo per recuperare tutte le info necessarie per scaricare e visualizzare le fotografie nel nostro programma.<\/p>\n<p>Vedremo via via come inserire queste funzionalit\u00e0 all&#8217;interno della nostra applicazione, ma prima di partire dovremmo avere almeno uno stralcio di piano.<!--more--><\/p>\n<p>Il buon senso del programmatore insegna che \u00e8 sempre bene tenere distinte le funzionalit\u00e0 di un programma, al fine di renderlo pi\u00f9 facile da mantenere, correggere e riutilizzare.<\/p>\n<p>In questo nostro programma si notano almeno tre &#8220;parti&#8221; distinte..abbiamo la parte che si occupa di scaricare il file xml, la parte che si occupa di eseguire il parsing \u00a0e di generare gli url delle fotografie e la parte che le visualizza sullo schermo, tenteremo per quanto ci \u00e8 possibile di tenere separate queste funzionalit\u00e0.<\/p>\n<p>Forti di questo piano creiamo un nuovo progetto con Xcode, consiglio di utilizzare <em>View-based application<\/em> come tipologia di progetto, e di chiamarlo <em>devFlickr<\/em>.<\/p>\n<p>Ovviamente il nome non ha nessuna importanza ma se utilizzate lo stesso nome che ho usato io avrete meno difficolt\u00e0 a seguire gli esempi.<\/p>\n<p>La prima cosa che vogliamo fare \u00e8 costruire una classe il cui compito \u00e8 quello di scaricare il file xml dal sito di flickr.<\/p>\n<p>Per far questo creiamo una nuova classe cliccando sul men\u00f9 &#8220;file&#8221; e successivamente su &#8220;new file&#8221;. Dalla finestra che appare selezioniamo &#8220;objective-c class&#8221; dalla categoria &#8220;Cocoa Touch Class&#8221; avendo cura che nel men\u00f9 a tendina in basso alla voce &#8220;subclass of&#8221; sia selezionato &#8220;NSObject&#8221;.<\/p>\n<p>Chiamiamo la nostra classe &#8220;interestingness.m&#8221; e assicuriamoci che sia spuntata la casella &#8220;also create .h file&#8221;<\/p>\n<p><strong>NOTA:<\/strong> <em>Questa che abbiamo appena eseguito \u00e8 la procedura standard per la creazione di una nuova classe che eredita direttamente da NSObject, negli esempi a seguire quando ci capiter\u00e0 di crearne altre, potrete fare riferimento a questo testo.<\/em><\/p>\n<p>Questa classe avr\u00e0 bisogno di almeno due membri, uno conterr\u00e0 il file XML scaricato dal sito di flick e sar\u00e0 di tipo NSData, l&#8217;altro lo utilizzeremo per memorizzare  la chiave API  ed \u00e8 di tipo NSString.<\/p>\n<p><strong>NOTA:<\/strong> <em>Una precisazione, mi capiter\u00e0 di utilizzare i termini &#8220;membro&#8221;, &#8220;variabile&#8221;, &#8220;propriet\u00e0&#8221;&#8230;in realt\u00e0 questi tre termini avrebbero significati diversi, ma per i nostri scopi questi termini indicano tutti il concetto di variabile interna di una classe.<\/em><\/p>\n<p>Ricordiamo che questa classe eseguir\u00e0 il download del file xml da un url costruito appositamente secondo le specifiche di flickr, per\u00f2 la prima parte di questo url \u00e8 fissa, possiamo quindi, per rendere pi\u00f9 leggibile il codice, inserirla in un costrutto <em>#define<\/em>.<\/p>\n<p>A questo punto il file interestingness.h sar\u00e0 questo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"false\">\r\n#import <Foundation\/Foundation.h>\r\n#define INTERESTIGNESS_BASE_URL @\"http:\/\/api.flickr.com\/services\/rest\/?method=flickr.interestingness.getList\"\r\n\r\n@interface interestingness : NSObject {\r\n\tNSData\t\t*interestingnessXML;\r\n\tNSString\t*apikey;\r\n}\r\n@end\r\n<\/pre>\n<p>Per chi non avesse mai incontrato il costrutto #define chiariamo che molto semplicemente durante la fase di compliazione tutte le occorrenze nel nostro codice del termine INTERESTIGNESS_BASE_URL vengono sostituite con la stringa<\/p>\n<pre lang=\"objc\" escaped=\"false\">\r\n@\"http:\/\/api.flickr.com\/services\/rest\/?method=flickr.interestingness.getList\"\r\n<\/pre>\n<p>Passiamo ora al file <em>interestingness.m<\/em>, ovvero all&#8217;implementazione della nostra classe.<\/p>\n<p>Avrete notato che non ho dichiarato come @property i membri della classe, inoltre non ho utilizzato neanche @syntetize, questo perch\u00e8 ho notato che questi costrutti, che nascono per semplificare la vita al programmatore, in realt\u00e0 confondono chi \u00e8 alle prime armi.<\/p>\n<p>Provvediamo quindi a creare (alla vecchia maniera) i medoti getter e setter per i membri che abbiamo definito, non sono altro che i metodi che dovremo invocare per leggere e scrivere i valori delle due variabili.<\/p>\n<p>aggiungiamo quindi nel file questi metodi:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"false\">\r\n- (NSData *)getinterestingnessXML\r\n{\r\n\treturn interestingnessXML;\r\n}\r\n\r\n- (void) setinterestignessXML:(NSData *)anXML\r\n{\r\n\tinterestingnessXML = anXML;\r\n}\r\n\r\n- (NSString *)getapikey\r\n{\r\n\treturn apikey;\r\n}\r\n\r\n- (void) setapikey:(NSString *)anApiKey\r\n{\r\n\tapikey = anApiKey;\r\n}\r\n<\/pre>\n<p>Poich\u00e8 chi utilizzer\u00e0 questa nostra classe dovr\u00e0 necessariamente, dopo averla istanziata, settare il valore di apikey, potrebbe essere carino fornire un metodo per fare entrambe le cose insieme.<\/p>\n<p>creiamo quindi un nostro metodo initWithApiKey in questo modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"false\">\r\n- (id)initWithApiKey:(NSString *)anApiKey\r\n{\r\n\tif (self = [super init])\r\n    {\r\n\t\t[self setapikey:anApiKey];\r\n    }\r\n    return self;\r\n}\r\n<\/pre>\n<p>Cosa fa questo frammento di codice? Serve per inizializzare l&#8217;oggetto, ovvero ad assegnare a tutte le variabili all&#8217;interno dell&#8217;oggetto i valori appropriati.<\/p>\n<p>Ma il nostro oggetto eredita da NSObject quindi durante l&#8217;inizializzazione dobbiamo per prima cosa invocare il metodo init di NSObject (la nostra super-classe) in modo che l&#8217;oggetto stesso venga inizializzato. Viceversa se non avessimo scritto [super init] l&#8217;oggetto non sarebbe stato inizializzato ed il tentare di impostare [self setapikey] avrebbe generato chiaramente un errore.<\/p>\n<p>Vediamo ora il metodo per effettuare il vero e proprio download del file.<\/p>\n<p>Il codice \u00e8 il seguente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"false\">\r\n- (NSData *)downloadXML\r\n{\r\n\r\n\tNSString *fullAddress = [NSString stringWithFormat:@\"%@&amp;api_key=%@\",FLICKR_INTERESTIGNESS_GETLIST_URL,[self getapikey]];\r\n\tNSData *tmp = [NSData dataWithContentsOfURL:[NSURL URLWithString:fullAddress]];\r\n\t[self setinterestignessXML:tmp];\r\n}\r\n<\/pre>\n<p>per prima cosa costruiamo l&#8217;indirizzo vero e proprio, poi utilizziamo il metodo <strong>dataWithContentsOfURL<\/strong> per effettuare il download del file xml, infine utilizziamo il metodo setter per assegnare alla variabile interestignessXML il valore corretto.<\/p>\n<p>Con questo la nostra prima classe \u00e8 quasi terminata.<\/p>\n<p>Per completezza dovremmo inserire le dichiarazioni dei metodi all&#8217;interno del file .h per evitare warning in fase di compilazione e per aiutare Xcode con l&#8217;autocompletamento.<\/p>\n<p>A questo punto potreste avere la smania di vedere all&#8217;opera questa classe&#8230;ancora non \u00e8 il momento, ma se proprio non state nella pelle fate cos\u00ec:<\/p>\n<p>editate il file <em>devFlickrViewController.m<\/em> aggiungendo in alto la stringa<\/p>\n<p><em>#import &#8220;interestingness.h&#8221;<\/em><\/p>\n<p>inoltre aggiungiamo questo metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"false\">\r\n- (void)viewDidLoad {\r\n    [super viewDidLoad];\r\n\tinterestingness *inter = [[interestingness alloc] initWithApiKey:@\"TUA_API_KEY\"];\r\n\t[inter downloadXML];\r\n\tprintf(\"FILE XML:\\n %s\",(char *)[[inter getinterestingnessXML] bytes]);\r\n}\r\n<\/pre>\n<p>Cosa stiamo facendo?<\/p>\n<p>Dichiariamo un oggetto di tipo &#8220;<em>interestigness<\/em>&#8220;, lo allochiamo e lo inizializziamo con il metodo &#8220;<em>initWithApiKey<\/em>&#8220;. Poi invochiamo il metodo &#8220;<em>downloadXML<\/em>&#8221; dell&#8217;oggetto appena dichiarato e infine accediamo alla sua propriet\u00e0 &#8220;<em>interestighessXML<\/em>&#8221; attraverso il metodo &#8220;<em>getInterestignessXML<\/em>&#8220;.<\/p>\n<p>Non fate caso al cast (char *)&#8230;serve in questo momento solo per far visualizzare il tutto sulla console.<\/p>\n<p>Provate ad eseguire il tutto, dovreste vedere sul simulatore una semplice schermata grigia, mentre sulla console dovreste riuscire a vedere l&#8217;intero file XML appena scaricato.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/www.devapp.it\/wordpress\/supporto-applicazioni\/parole-vietate-di-ignazio-calo\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bannerIgnazioc.png\" alt=\"\" width=\"480\" height=\"100\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ed eccocci alla seconda parte di questo tutorial, oggi inizieremo finalmente a scrivere un p\u00f2 di codice&#8230;.<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[240,238,241,242],"class_list":["post-3520","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-api-flickr","tag-flickr","tag-ignazio-calo","tag-tutorial-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=3520"}],"version-history":[{"count":25,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3520\/revisions"}],"predecessor-version":[{"id":5016,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3520\/revisions\/5016"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}