En aquest tema, aprendrem com gestionar les xarxes en Swift, una habilitat essencial per a qualsevol desenvolupador d'aplicacions mòbils. Les aplicacions modernes sovint necessiten comunicar-se amb serveis web per obtenir dades, enviar informació o interactuar amb altres sistemes. Swift proporciona diverses eines i biblioteques per facilitar aquestes tasques.
Continguts
Introducció a les Xarxes en Swift
Les xarxes en Swift es basen principalment en la classe URLSession
, que proporciona una API per a la descàrrega i càrrega de dades a través de la xarxa. Aquesta classe és molt flexible i permet realitzar peticions HTTP/HTTPS de manera senzilla.
URLSession
URLSession
és la classe principal per gestionar les xarxes en Swift. Proporciona diferents mètodes per realitzar peticions de xarxa, com ara dataTask
, uploadTask
i downloadTask
.
Exemple Bàsic d'URLSession
import Foundation let url = URL(string: "https://api.example.com/data")! let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("Error: \(error)") return } guard let data = data else { print("No data received") return } // Processar les dades print("Data: \(data)") } task.resume()
Explicació del Codi
- Importació de Foundation: Necessitem importar el framework
Foundation
per utilitzarURLSession
. - Creació de l'URL: Creem un objecte
URL
amb l'adreça del servei web. - Creació de la Tasca: Utilitzem
URLSession.shared.dataTask
per crear una tasca de xarxa. - Gestió de la Resposta: En el bloc de finalització, gestionem l'error, la resposta i les dades rebudes.
- Inici de la Tasca: Finalment, iniciem la tasca amb
task.resume()
.
Realitzar Peticions GET
Les peticions GET s'utilitzen per obtenir dades d'un servidor. A continuació, es mostra un exemple de com realitzar una petició GET.
Exemple de Petició GET
import Foundation func fetchData() { let url = URL(string: "https://api.example.com/data")! let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("Error: \(error)") return } guard let data = data else { print("No data received") return } do { let json = try JSONSerialization.jsonObject(with: data, options: []) print("JSON: \(json)") } catch { print("Error parsing JSON: \(error)") } } task.resume() } fetchData()
Explicació del Codi
- Funció fetchData: Definim una funció per encapsular la lògica de la petició GET.
- Serialització JSON: Utilitzem
JSONSerialization
per convertir les dades rebudes en un objecte JSON.
Realitzar Peticions POST
Les peticions POST s'utilitzen per enviar dades a un servidor. A continuació, es mostra un exemple de com realitzar una petició POST.
Exemple de Petició POST
import Foundation func postData() { let url = URL(string: "https://api.example.com/data")! var request = URLRequest(url: url) request.httpMethod = "POST" let parameters: [String: Any] = [ "name": "John", "age": 30 ] request.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) request.addValue("application/json", forHTTPHeaderField: "Content-Type") let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Error: \(error)") return } guard let data = data else { print("No data received") return } do { let json = try JSONSerialization.jsonObject(with: data, options: []) print("JSON: \(json)") } catch { print("Error parsing JSON: \(error)") } } task.resume() } postData()
Explicació del Codi
- Configuració de la Petició: Creem un objecte
URLRequest
i configurem el mètode HTTP a "POST". - Paràmetres de la Petició: Definim els paràmetres que volem enviar i els convertim a JSON.
- Capçaleres HTTP: Afegim la capçalera "Content-Type" per indicar que estem enviant JSON.
Gestió de Respostes
La gestió de respostes implica processar les dades rebudes del servidor i gestionar els errors que puguin ocórrer.
Exemple de Gestió de Respostes
import Foundation func handleResponse(data: Data?, response: URLResponse?, error: Error?) { if let error = error { print("Error: \(error)") return } guard let data = data else { print("No data received") return } do { let json = try JSONSerialization.jsonObject(with: data, options: []) print("JSON: \(json)") } catch { print("Error parsing JSON: \(error)") } }
Explicació del Codi
- Funció handleResponse: Definim una funció per gestionar la resposta de la xarxa.
- Gestió d'Errors: Comprovem si hi ha errors i els imprimim.
- Processament de Dades: Convertim les dades rebudes a JSON i les imprimim.
Gestió d'Errors
La gestió d'errors és crucial per assegurar que la nostra aplicació pugui gestionar situacions inesperades de manera elegant.
Exemple de Gestió d'Errors
import Foundation func fetchDataWithErrorHandling() { let url = URL(string: "https://api.example.com/data")! let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("Error: \(error.localizedDescription)") return } guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("Server error") return } guard let data = data else { print("No data received") return } do { let json = try JSONSerialization.jsonObject(with: data, options: []) print("JSON: \(json)") } catch { print("Error parsing JSON: \(error)") } } task.resume() } fetchDataWithErrorHandling()
Explicació del Codi
- Comprovació del Codi d'Estat: Verifiquem que el codi d'estat de la resposta estigui en el rang 200-299.
- Gestió d'Errors de Xarxa: Imprimim una descripció de l'error si n'hi ha.
Exercicis Pràctics
Exercici 1: Petició GET
Realitza una petició GET a l'API pública https://jsonplaceholder.typicode.com/posts
i imprimeix els resultats.
Solució
import Foundation func fetchPosts() { let url = URL(string: "https://jsonplaceholder.typicode.com/posts")! let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("Error: \(error)") return } guard let data = data else { print("No data received") return } do { let json = try JSONSerialization.jsonObject(with: data, options: []) print("JSON: \(json)") } catch { print("Error parsing JSON: \(error)") } } task.resume() } fetchPosts()
Exercici 2: Petició POST
Realitza una petició POST a l'API pública https://jsonplaceholder.typicode.com/posts
amb els següents paràmetres: title
, body
i userId
.
Solució
import Foundation func createPost() { let url = URL(string: "https://jsonplaceholder.typicode.com/posts")! var request = URLRequest(url: url) request.httpMethod = "POST" let parameters: [String: Any] = [ "title": "foo", "body": "bar", "userId": 1 ] request.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) request.addValue("application/json", forHTTPHeaderField: "Content-Type") let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Error: \(error)") return } guard let data = data else { print("No data received") return } do { let json = try JSONSerialization.jsonObject(with: data, options: []) print("JSON: \(json)") } catch { print("Error parsing JSON: \(error)") } } task.resume() } createPost()
Conclusió
En aquesta secció, hem après com gestionar les xarxes en Swift utilitzant URLSession
. Hem vist com realitzar peticions GET i POST, gestionar respostes i errors, i hem practicat amb exercicis pràctics. Aquestes habilitats són fonamentals per desenvolupar aplicacions mòbils que necessiten comunicar-se amb serveis web. En el següent tema, explorarem com utilitzar Core Data per gestionar dades persistents en les nostres aplicacions.
Curs de Programació en Swift
Mòdul 1: Introducció a Swift
- Introducció a Swift
- Configuració de l'Entorn de Desenvolupament
- El Teu Primer Programa en Swift
- Sintaxi i Estructura Bàsica
- Variables i Constants
- Tipus de Dades
Mòdul 2: Flux de Control
Mòdul 3: Funcions i Closures
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Closures
- Funcions d'Ordre Superior
Mòdul 4: Programació Orientada a Objectes
Mòdul 5: Swift Avançat
Mòdul 6: Swift i Desenvolupament iOS
- Introducció al Desenvolupament iOS
- Conceptes Bàsics de UIKit
- Storyboards i Interface Builder
- Xarxes en Swift
- Core Data
- Conceptes Bàsics de SwiftUI