• Non ci sono risultati.

Principali classi dell’applicazione

Nel documento Applicazioni di Web 2.0 in ambiente iOS (pagine 56-63)

3.2 Principali aspetti implementativi

3.2.2 Principali classi dell’applicazione

DataViewController

Questa classe che estende UIViewController gestisce la vista per l’invio e la ricezione di dati. Al suo interno sono implementate le label delle coordi- nate, un campo di testo per l’inserimento di un commento e gli slider relativi alle opzioni quali raggio, numero minimo e massimo di utenti. Inoltre si prende cura dell’invio dei dati al webserver e della ricezione di essi, nonch´e

3.2 Principali aspetti implementativi 41 delle operazioni di parsing dell’Xml.

Quando nella classe MapViewController viene premuto il bottone di naviga- zione in alto a destra, essa inizializza questa classe fornendo le coordinate geografiche dell’utente.

Questi dati, insieme a quelli inseriti tramite l’interfaccia dall’utente, vengono salvati sotto forma di una stringa e poi inviati al server via HTTP, utiliz- zando il metodo POST, verso la pagina sendData.php. Il server utilizza i dati, interroga il database e fornisce in risposta una stringa Xml. In caso il dispositivo non riesca a leggere i dati viene mostrata una finestra di errore altrimenti la stringa viene parsata utilizzando la classe NSXMLParser ed i singoli dati inseriti in un array globale e resi disponibili alle altri classi per la visualizzazione sulla mappa.

Per quanto riguarda l’invio dei dati in questa classe `e indicato l’indirizzo del server locale nell’istruzione sottostante.

Listing 3.1: Url del server

NSURL * url = [ NSURL U R L W i t h S t r i n g : @ " http :// localhost :88 88/ Tesi / sendData . php "];

Questo indirizzo dovr`a essere sostituito con quello della macchina server esterna al momento di implementare l’applicazione su dispositivo.

Singleton

Nella programmazione ad oggetti un singleton `e un design pattern crea- zionale che ha come scopo quello di garantire che di una determinata classe venga creata una e una sola istanza, e di fornire un punto di accesso globale a tale istanza.

Nel nostro caso si occupa di gestire variabili globali che possono essere scritte e lette dalle diverse classi che compongono l’applicazione. Ad esempio nella classe DataViewController quando i dati Xml sono stati parsati attraverso la funzione impostaArray l’array con le location diventa globale e pu`o in que-

sto modo essere letto anche dalle altre classi grazie alla funzione ritornaArray.

Listing 3.2: Array globale

// Con questo metodo imposto il valore dell ’ item condiviso + ( void ) i m p o s t a A r r a y :( N S M u t a b l e A r r a y *) valore {

a r r a y C o n d i v i s o = valore ; }

// Con questo metodo , prelevo il valore dell ’ item condiviso // da qualsiasi classe

+ ( N S M u t a b l e A r r a y *) r i t o r n a A r r a y { return a r r a y C o n d i v i s o ; }

Le altre funzioni di questa classe vengono utilizzate per impostare e ritor- nare variabili globali come il colore dei pin, l’attivazione/disattivazione degli overlay attorno ai pin e l’array dei messaggi della location selezionata per poterli visualizzare nella vista delle informazioni.

MyAnnotation

La classe MyAnnotation, che estende NSObject ed implementa il proto- collo di MKAnnotation, `e utilizzata per creare un’annotazione personalizzata che comparir`a sulla mappa nel momento in cui l’utente toccher`a il pin. Contiene le coordinate dell’utente oltre a tutti i dati della location cui si riferisce oltre ad un titolo ed un sottotitolo.

Viene creata un’istanza di MyAnnotation per ogni location sulla mappa al- l’interno del metodo viewWillAppear nella classe MapViewController in modo che la lista delle annotazioni sia aggiornata ogni volta che viene ricaricata la vista con la mappa.

In particolare il metodo initWithCoordinate permette di inizializzare l’anno- tation partendo dalle coordinate del punto e da tutti gli altri dati (numero di persone, et`a, utenti maschi e femmine, id dell’annotazione). In questo caso il titolo verr`a impostato a “Altra location” ed il sottotitolo mostrer`a il numero di utenti in quella location.

3.2 Principali aspetti implementativi 43 Diversamente il metodo initWithUserLocation crea un’annotazione con le coordinate dell’utente. Quest’ultimo metodo, una volta installata l’appli- cazione sul dispositivo, potr`a non essere pi`u utilizzato poich´e sul disposi- tivo, al posto del pin che indica la location dell’utente avremo un pallino azzurro come indicato nelle problematiche e nella descrizione della classe MapViewController.

OptionViewController

Classe del tutto simile a DataViewController che gestisce la vista per le opzioni e viene richiamata cliccando sul bottone a destra della tab bar che si trova nella parte bassa dello schermo.

L’interfaccia corrispondente contiene uno slider per l’et`a dell’utente, un bot- tone per la scelta del sesso, un bottone per impostare il colore dei pin e ed uno switch per permettere all’utente di abilitare o disabilitare i cerchi alla base dei pin (overlay) che servono ad indicare il numero di utenti.

Una volta impostate le opzioni (non necessariamente tutte) queste vengono rese globali attraverso la classe singleton descritta precedentemente in modo da non doverle reinserire ogni volta che si cambia schermata.

I dati come l’et`a e il sesso vengono poi inviati dalla classe DataViewControl- ler al server mentre il colore del pin cos`ı come gli overlay vengono impostati nella classe MapViewController.

MapViewController

Classe principale del progetto, estende anch’essa UIViewController, ed implementa MKMapViewDelegate e CLLocationManagerDelegate, utilizza- te per la gestione della mappa e delle coordinate geografiche. Si occupa di gestire e visualizzare la posizione dell’utente all’interno della mappa, dello zoom e dello scorrimento di essa e del posizionamento dei nuovi pin ottenuti dalla richiesta al webserver.

e lo scorrimento della mappa per poter mostrare la posizione esatta dell’u- tente.

Ogni volta che invece vengono ricevuti i dati e, dalla vista DataViewControl- ler si clicca sul pulsante Map nella barra di navigazione per tornare a questa vista, fa un refresh facendo comparire i pin delle nuove location trovate. Per far ci`o nel metodo viewWillAppear, che viene chiamato ogni volta che si ricarica la vista, viene svuotato l’array delle location, attraverso il singleton viene letto l’array aggiornato e per ogni annotation in esso viene inserito un pin e, grazie alla funzione addOverlay un cerchio che indica gli utenti alla sua base.

Il raggio del cerchio ha come dimensione il doppio degli utenti pi`u uno. I cerchi alla base dei pin possono essere disabilitati dalla finestra delle opzioni in modo da rendere la consultazione pi`u veloce e meno confusionaria nel caso di un numero elevato di location.

Come si pu`o vedere in questo estratto del codice che si trova all’interno di un ciclo for, per ogni elemento all’interno dell’array webPlaceList viene creata una nuova annotazione a cui vengono passati tutti i dati relativi a quella location. L’annotazione viene poi aggiunta all’array placeList e rilasciata. Nell’ultima riga viene calcolato il raggio del cerchio che verr`a visualizzato attorno al pin.

Listing 3.3: Inserimento dell’annotazione e calcolo del raggio M y A n n o t a t i o n * n e w A n n o t a t i o n = [[ M y A n n o t a t i o n alloc ] i n i t W i t h C o o r d i n a t e : locationN ew n u m b e r O f P e o p l e : peopNumbe r averageAg e : avgAge male : maleN female : femaleN i d O f A n n o t a t i o n : a n n o t a t i o n I D ]; [ placeList addObject : n e w A n n o t a t i o n ]; [ n e w A n n o t a t i o n release ]; int C i r c l e R a d i u s = peopNumber *2 + 1;

3.2 Principali aspetti implementativi 45 Infine attraverso la funzione [locationManager startUpdatingLocation]; vie- ne aggiornata la mappa.

Dopo aver rappresentato sullo schermo le posizioni delle nuove location con i relativi pin in questa classe vengono gestite le annotazioni su cui `e indicato il numero di utenti e il collegamento con la vista delle informazioni relative ad una location, fornito dal metodo calloutAccessoryControlTapped che viene richiamato quando l’utente preme il pulsante a forma di freccia che si trova sull’annotazione.

`

E importante mettere in evidenza, come anche descritto successivamente nel- la sezione relativa alle problematiche, che quando l’applicazione verr`a instal- lata su dispositivo sar`a opportuno decommentare la seguente istruzione che permette di indicare la posizione esatta dell’utente sulla mappa attraverso un pallino azzurro.

Listing 3.4: Funzione per mostrare la posizione dell’utente sulla mappa // map . s h o w s U s e r L o c a t i o n = YES ;

Una volta che la posizione dell’utente viene visualizzata grazie a questa istruzione, naturalmente si potr`a anche rimuovere dal codice la parte re- lativa all’annotazione sulla posizione dell’utente che si trova nel metodo didUpdateToLocation.

InfoViewController

Altra classe che estende UIViewController e gestisce la vista delle infor- mazioni relative ad una specifica location.

Ha al suo interno delle UILabel che contengono i dati di quella posizione come la distanza dalla posizione in cui si trova l’utente (che per`o non viene calcolata nel simulatore), il numero di utenti in quella posizione, la media dell’et`a e il numero di utenti maschi e femmine. In basso, quando presenti, sono mostrati gli ultimi messaggi lasciati dagli utenti inseriti in una tabella scorrevole.

Viene richiamata quando si preme il callout button all’interno dell’annotazio- ne relativa ad un pin.

Nel metodo principale nel codice di questa classe vengono inizialmente lette le informazioni relative alla location specificata attraverso i singleton, come gi`a descritto in questa sezione.

In particolare l’indirizzo viene ottenuto attraverso un’operazione di reverse geocoding partendo dalla longitudine e latitudine del punto, utilizzando le apposite funzioni messe a disposizione dal Map Kit Framework.

Nell’estratto di codice che segue viene mostrata la funzione per ottenere il reverse geocoding. In particolare si `e deciso di mostrare soltanto il nome della via nell’indirizzo della location poich´e, esaminando le location attorno all’utente, sembrava inutile inserire altri dati come la citt`a, la regione o lo stato.

Il secondo metodo restituisce un errore quando, per qualche motivo, l’opera- zione non va a buon fine.

Listing 3.5: Funzione per ricavare l’indirizzo attraverso il reverse geocoding -( void ) r e v e r s e G e o c o d e r :( M K R e v e r s e G e o c o d e r *) geocoder

d i d F i n d P l a c e m a r k :( MKPlacema r k *) placemark {

N S D i c t i o n a r y * addressDa ta = placemark . a d d r e s s D i c t i o n a r y ; CGFloat y = 50;

int count = 0;

for ( NSString * key in [ addressDa ta allKeys ]) { if ([ key compare : @ " F o r m a t t e d A d d r e s s L i n e s "] != N S O r d e r e d S a m e ) { count ++; if ([ key i s E q u a l T o S t r i n g : @ " Street "]) { a d d r e s s L a b e l . text = [ NSString s t r i n g W i t h F o r m a t : @ "% @ : % @ " , key , [ addressDa t a o b j e c t F o r K e y : key ]]; } y += 24; } } } - ( void ) r e v e r s e G e o c o d e r :( M K R e v e r s e G e o c o d e r *) geocoder

3.2 Principali aspetti implementativi 47

d i d F a i l W i t h E r r o r :( NSError *) error {

a d d r e s s L a b e l . text = @ " Reverse geocoding failed , try again "; }

Successivamente, come avviene all’interno della classe DataViewController viene fatta una richiesta HTTP di tipo POST indicando l’id della location alla pagina getMessage.php sul server che restituisce (se presenti) i messaggi relativi con una stringa Xml che viene poi parsata.

I messaggi sono cos`ı salvati in un array ed inseriti in una tabella per essere mostrati nella vista.

Anche in questo caso l’indirizzo del server locale `e stato sostituito al momento di testare l’applicazione con un server remoto via web.

Nel documento Applicazioni di Web 2.0 in ambiente iOS (pagine 56-63)

Documenti correlati