Scaricare i dati del Millennium Falcon con una chiamata REST usando Alamofire e Swift

In questo articolo vedremo come eseguire una chiamata REST ai webservice gratuiti del sito Star Wars API per scaricare alcune informazioni relative al Millennium Falcon. Iniziamo!

Creiamo il progetto

  1. Aprite Xcode e selezionate File > New > Project...
  2. Nella schermata che appare
    scegliete Single View Application e premete Next
  3. Compilate la prossima schermata come descritto di seguito:
    1. Product Name: Star Wars Api
    2. Team: None
    3. Organization Name: [Il vostro nome]
    4. Organisation Identifier: L'indirizo del vostro sito reverse DNS (esempio: com.vostrosito). Se non possedete un dominio digitate quello che volete.
    5. Language: Swift
    6. Devices: iPhone
  4. Infine lasciate le 3 checkbox deselezionate e premete Next
  5. Scegliete dove salvare il progetto e premete Create

Importare le librerie

Dobbiamo ora importare le 2 librerie che useremo: Alamofire e SwiftyJSON. Prima di tutto accertatevi di avere CocoaPods installato (trovate come fare seguendo Installare Cocoapods di questo articolo)

Bene, ora che avete CocoaPods chiudete Xcode, aprite il Terminale e raggiungete la cartella del vostro progetto.

Poi digitate nel terminale

Adesso aprite con Xcode il podfile con un editore testuale e modificatelo come mostrato di seguito

Salvate il file, tornate al terminale e digitate

Ora dovete attendere che CocoaPods scarichi le librerie che avete indicato. Aspettate finché l’operazione non viene completata nel terminale.

Finito? Testiamo subito che le librerie siano state scaricate. Con Xcode aprite il workspace Star Wars Api.xcworkspace.

Attenzione non dovete più aprire il progetto direttamente, da ora in poi aprirete il workspace.

Se aprite il Project Navigator dovreste vedere Alamofire e SwiftyJSON dentro il gruppo Pods.

Inoltre se aprite ViewController.swift e lo modificate come segue

dovreste riuscire a compilare correttamente.

Se tutto funziona passiamo allo step successivo.

Star Wars Api

Il sito Star Wars API fornisce delle API gratuite per recuperare informazioni relative all’universo di Star Wars.

In particolare se digitate starships/10/ e premete Request vedrete apparire un JSON contente i dati del Millennium Falcon.

Bene, vediamo come creare un Model Value per recuperare ed immagazzinare alcune di queste informazioni.

La struct StarshipModel

Esistono tanti modi per creare un model per un JSON in iOS.

Noi useremo quello suggerito da Apple 🙂

Ovvero

  • una struct
  • non optional properties
  • con un failable initializer
  • e un metodo statico per recuperare informazioni da remoto.

Create un nuovo file Swift (File > New > File...) e salvatelo con nome StrarshipModel.

Ora incollate al suo interno il seguente codice.

Compilate con cmd + B.

Failable Initializer

Vogliamo aggiungere a questa struct un initializer che riceve un JSON e cerca di inizializzare tutte le property. Se tutte le informazioni vengono trovate nel JSON allora l’inizializzazione va a buon fine, altrimenti ritorna nil.

Ecco il nuovo codice

All’interno dell’initializer stiamo usando il costrutto guard per avere la certezza che il JSON contenga tutte le informazioni che ci aspettiamo. Se per qualche motivo il JSON non è completo il guard fallisce e viene invocato il return nil.

E’ importante in questo caso non fare mai assunzioni sulla correttezza e completezza del JSON. Si tratta di dati ricevuti da un server remoto e quindi non sotto il nostro controllo.

Ad esempio è estremamente pericoloso in questo contesto usare il per forzare l’estrazione di determinati valori dal JSON perché in caso di JSON incompleto otterreste un crash dell’intera app.

Eseguire una chiamata REST

Non rimane che usare la potete libreria Alamofire per eseguire una chiamata REST.

Questo metodo va aggiunto inserito dentro la struct StarshipModel (niente paura, tra poco riassumeremo il codice intero di StarshipModel).

Il metodo riceve 2 parametri:

  1. l’ID della Starship che vogliamo recuperare da Star Wars API
  2. una closure che chiameremo in modo asincrono per restituire il risultato al chiamante

Come vedete stiamo eseguendo una chiamata con Alamofire.request.

Poi ci accertiamo che la response contenga dei dati e non si sia verificato un errore.

Poi trasformiamo il valore di tipo Data in un JSON.

E infine trasformiamo il JSON in uno StarshipModel?

Importante: ricordiamo che nella riga precedente stiamo invocando un failable initializer. Quindi il risultato sarà un optional ovvero di tipo StarshipModel?.

Infine passiamo il risultato (che potrà essere un valore di tipo StarshipModel oppure nil) alla closure in modo da trasmetterlo al chiamante.

Infine ecco il codice completo di StarshipModel.

Recuperare i dati da Star Wars API

Non ci rimane che recuperare i dati. Aprite ViewController.swift e aggiornatelo come mostrato di seguito

Come vedete con StarshipModel.fetch(byID: "10") stiamo eseguendo la chiamata remota. Poi usiamo la closure che segue

per stampare il risultato.

Premete cmd + ⇧ + c per attivare la console di Xcode.

Poi premete cmd + R per eseguire l’app.

Nella console dovrebbero apparire le informazioni recuperate dalle API remote.

 

 

 

Luca Angeletti

Trainer • Developer • Writer

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *