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
Foundationper utilitzarURLSession. - Creació de l'URL: Creem un objecte
URLamb l'adreça del servei web. - Creació de la Tasca: Utilitzem
URLSession.shared.dataTaskper 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
JSONSerializationper 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
URLRequesti 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
