Molto spesso, in molte applicazioni, abbiamo necessità che certe operazioni vengano eseguite in maniera programmata a certi intervalli di tempo. Per esempio, in un gioco potremo utilizzare questo metodo per far apparire sullo schermo degli ostacoli che il presonaggio deve evitare. Ciò che ci permette di utilizzare, in maniera molto efficiente, un timer è la classe NSTimer. Con questo strumento saremo in grado di realizzare tantissime applicazioni dove il tempo risulta elemento essenziale come per esempio un’applicazione sveglia oppure un’applicazione agenda con la quale gestire i vari impegni.
Nella nostra applicazione d’esempio nella quale sfrutteremo un timer, vogliamo che con una certa periodicità appaia sullo schermo un’immagine in una posizione random dello schermo del simulatore. Più precisamente vogliamo che ogni tre secondi venga generata un’immagine e, pertanto, abbiamo bisogno di un timer che tiene conto del passaggio del tempo e che richiami un metodo nel quale viene istanziata l’immagine e mostrata a video. Creiamo il solito progetto e spostiamoci nel file di implementazione del viewController nel metodo viewDidLoad. Per quanto riguarda la dichiarazione del timer e la successiva allocazione ed inizializzzione utilizzeremo il seguente codice:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self
selector:@selector(creaImmagine) userInfo:nil repeats:YES];
Come possiamo vedere il metodo prende in ingresso diversi parametri. Quello che a noi interessa maggiormente è il parametro scheduledTimerWithTimeInterval che permette di impostare ogni quanto chiamare il metodo all’interno del selector.
Il parametro repeats accetta come valori YES o NO; nel nostro caso, inserendo YES, avremo che ogni volta che il timer raggiungerà i tre secondi richiamerà il metodo creaImmagine dopo di che il timer verrà azzerato e richiamerà nuovamente il metodo dopo tre secondi. Questa è dunque l’unica riga di codice necessaria per istruire a dovere il nostro timer.
A questo punto è sufficiente creare il metodo creaImmagine che conterrà il seguente codice:
UIImageView *imageView;
int origineX = arc4random()%320;
int origineY = arc4random()%480;
CGRect frame = CGRectMake(origineX, origineY, 70, 70);
imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = [UIImage imageNamed:@"Paesaggi05.png"];
[self.view addSubview:imageView];
Come possiamo vedere vengono dichiarate due variabili di tipo int che conterranno le coordinate del punto dello schermo dove iniziare a disegnare l’immagine che poi saranno i parametri della funzione CGRectMake. A questa variabile viene assegnato un valore random grazie alla funzione arc4random() la quale ritorna un numero che poi viene calcolato per le x in modulo 320 e per le y in modulo 480. Il calcolo del modulo viene eseguito per garantire che le due variabili abbiano un valore coerente con le dimensioni, in pixel, del dispositivo.
Il resto del codice, a questo punto della guida, è di ovvia comprensione per il lettore.Ampliando dunque le funzionalità del metodo possiamo realizzare applicazioni, basate sul tempo, anche di notevole complessità. Per far ciò consigliamo al lettore di leggere, sul sito della Apple, le reference per la classe NSTimer che contiene la lista dei metodi che la classe ci offre, alcuni di ottima utilità.
Per completare questo capitolo andiamo adesso a vedere come è possibile stoppare un timer con il seguente codice:
[timer invalidate];
Diciamo che questo metodo, oltre che a stoppare il timer, lo invalida del tutto e dunque, una volta invalidato, il timer sarà inutilizzabile. Ciò vuol dire che, dopo essere invalidato, il timer non può in nessun caso essere riavviato e qualora si continui ad utilizzarlo l’applicazione potrebbe subire un crash inaspettato.