
Ed eccocci alla seconda parte di questo tutorial, oggi inizieremo finalmente a scrivere un pò di codice.
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à poi analizzarlo per recuperare tutte le info necessarie per scaricare e visualizzare le fotografie nel nostro programma.
Vedremo via via come inserire queste funzionalità all’interno della nostra applicazione, ma prima di partire dovremmo avere almeno uno stralcio di piano.
Il buon senso del programmatore insegna che è sempre bene tenere distinte le funzionalità di un programma, al fine di renderlo più facile da mantenere, correggere e riutilizzare.
In questo nostro programma si notano almeno tre “parti” distinte..abbiamo la parte che si occupa di scaricare il file xml, la parte che si occupa di eseguire il parsing e di generare gli url delle fotografie e la parte che le visualizza sullo schermo, tenteremo per quanto ci è possibile di tenere separate queste funzionalità.
Forti di questo piano creiamo un nuovo progetto con Xcode, consiglio di utilizzare View-based application come tipologia di progetto, e di chiamarlo devFlickr.
Ovviamente il nome non ha nessuna importanza ma se utilizzate lo stesso nome che ho usato io avrete meno difficoltà a seguire gli esempi.
La prima cosa che vogliamo fare è costruire una classe il cui compito è quello di scaricare il file xml dal sito di flickr.
Per far questo creiamo una nuova classe cliccando sul menù “file” e successivamente su “new file”. Dalla finestra che appare selezioniamo “objective-c class” dalla categoria “Cocoa Touch Class” avendo cura che nel menù a tendina in basso alla voce “subclass of” sia selezionato “NSObject”.
Chiamiamo la nostra classe “interestingness.m” e assicuriamoci che sia spuntata la casella “also create .h file”
NOTA: Questa che abbiamo appena eseguito è la procedura standard per la creazione di una nuova classe che eredita direttamente da NSObject, negli esempi a seguire quando ci capiterà di crearne altre, potrete fare riferimento a questo testo.
Questa classe avrà bisogno di almeno due membri, uno conterrà il file XML scaricato dal sito di flick e sarà di tipo NSData, l’altro lo utilizzeremo per memorizzare la chiave API ed è di tipo NSString.
NOTA: Una precisazione, mi capiterà di utilizzare i termini “membro”, “variabile”, “proprietà”…in realtà questi tre termini avrebbero significati diversi, ma per i nostri scopi questi termini indicano tutti il concetto di variabile interna di una classe.
Ricordiamo che questa classe eseguirà il download del file xml da un url costruito appositamente secondo le specifiche di flickr, però la prima parte di questo url è fissa, possiamo quindi, per rendere più leggibile il codice, inserirla in un costrutto #define.
A questo punto il file interestingness.h sarà questo:
#import
#define INTERESTIGNESS_BASE_URL @"http://api.flickr.com/services/rest/?method=flickr.interestingness.getList"
@interface interestingness : NSObject {
NSData *interestingnessXML;
NSString *apikey;
}
@end
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
@"http://api.flickr.com/services/rest/?method=flickr.interestingness.getList"
Passiamo ora al file interestingness.m, ovvero all’implementazione della nostra classe.
Avrete notato che non ho dichiarato come @property i membri della classe, inoltre non ho utilizzato neanche @syntetize, questo perchè ho notato che questi costrutti, che nascono per semplificare la vita al programmatore, in realtà confondono chi è alle prime armi.
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.
aggiungiamo quindi nel file questi metodi:
- (NSData *)getinterestingnessXML
{
return interestingnessXML;
}
- (void) setinterestignessXML:(NSData *)anXML
{
interestingnessXML = anXML;
}
- (NSString *)getapikey
{
return apikey;
}
- (void) setapikey:(NSString *)anApiKey
{
apikey = anApiKey;
}
Poichè chi utilizzerà questa nostra classe dovrà necessariamente, dopo averla istanziata, settare il valore di apikey, potrebbe essere carino fornire un metodo per fare entrambe le cose insieme.
creiamo quindi un nostro metodo initWithApiKey in questo modo:
- (id)initWithApiKey:(NSString *)anApiKey
{
if (self = [super init])
{
[self setapikey:anApiKey];
}
return self;
}
Cosa fa questo frammento di codice? Serve per inizializzare l’oggetto, ovvero ad assegnare a tutte le variabili all’interno dell’oggetto i valori appropriati.
Ma il nostro oggetto eredita da NSObject quindi durante l’inizializzazione dobbiamo per prima cosa invocare il metodo init di NSObject (la nostra super-classe) in modo che l’oggetto stesso venga inizializzato. Viceversa se non avessimo scritto [super init] l’oggetto non sarebbe stato inizializzato ed il tentare di impostare [self setapikey] avrebbe generato chiaramente un errore.
Vediamo ora il metodo per effettuare il vero e proprio download del file.
Il codice è il seguente:
- (NSData *)downloadXML
{
NSString *fullAddress = [NSString stringWithFormat:@"%@&api_key=%@",FLICKR_INTERESTIGNESS_GETLIST_URL,[self getapikey]];
NSData *tmp = [NSData dataWithContentsOfURL:[NSURL URLWithString:fullAddress]];
[self setinterestignessXML:tmp];
}
per prima cosa costruiamo l’indirizzo vero e proprio, poi utilizziamo il metodo dataWithContentsOfURL per effettuare il download del file xml, infine utilizziamo il metodo setter per assegnare alla variabile interestignessXML il valore corretto.
Con questo la nostra prima classe è quasi terminata.
Per completezza dovremmo inserire le dichiarazioni dei metodi all’interno del file .h per evitare warning in fase di compilazione e per aiutare Xcode con l’autocompletamento.
A questo punto potreste avere la smania di vedere all’opera questa classe…ancora non è il momento, ma se proprio non state nella pelle fate così:
editate il file devFlickrViewController.m aggiungendo in alto la stringa
#import “interestingness.h”
inoltre aggiungiamo questo metodo:
- (void)viewDidLoad {
[super viewDidLoad];
interestingness *inter = [[interestingness alloc] initWithApiKey:@"TUA_API_KEY"];
[inter downloadXML];
printf("FILE XML:\n %s",(char *)[[inter getinterestingnessXML] bytes]);
}
Cosa stiamo facendo?
Dichiariamo un oggetto di tipo “interestigness“, lo allochiamo e lo inizializziamo con il metodo “initWithApiKey“. Poi invochiamo il metodo “downloadXML” dell’oggetto appena dichiarato e infine accediamo alla sua proprietà “interestighessXML” attraverso il metodo “getInterestignessXML“.
Non fate caso al cast (char *)…serve in questo momento solo per far visualizzare il tutto sulla console.
Provate ad eseguire il tutto, dovreste vedere sul simulatore una semplice schermata grigia, mentre sulla console dovreste riuscire a vedere l’intero file XML appena scaricato.










3 Responses to “T#047 – Accedere a Flickr dalle nostre applicazioni iPhone (parte 2)”
30 Maggio 2010
El JobsoVi dico solo una cosa dato che sono rimasto senza parole: Complimenti!
28 Ottobre 2010
MatteoRaga non va più il link del Source !
24 Marzo 2011
MatteoCiao ragazzi, ho trovato qualche piccolo errore di digitazione: Quando usiamo
#define INTERESTIGNESS_BASE_URL
Non dovrebbe essere
#define INTERESTINGNESS_BASE_URL?
Poi
NSString *fullAddress = [NSString stringWithFormat:@”%@&api_key=%@”,FLICKR_INTERESTIGNESS_GETLIST_URL,[self getapikey]];
Non dovremmo inserire INTERESTINGNESS_BASE_URL
invece di
FLICKR_INTERESTIGNESS_GETLIST_URL?