#Bonus Combine

Combine est un framework qui permet de gérer des événements asynchrones. Il est basé sur le pattern Observer.

Il est particulièrement utile pour gérer des appels réseau, des animations, des gestes, etc. En mode réactif. Il fonctionne très bien avec SwiftUI.

#Un point sur la programmation réactive

https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

#Exercices ~2h

  • Remplacer l’utilisation de async/await dans votre application par des appels réseaux utilisant Combine.

#Aide

Getting started with Combine : https://www.avanderlee.com/swift/combine/ Un tutoriel plus complet sur Combine : https://www.kodeco.com/books/combine-asynchronous-programming-with-swift/v2.0/chapters/1-hello-combine

Voici un exemple d’appel réseau avec Combine


import Combine
import Foundation

struct User: Codable {
    let id: Int
    let name: String
}

enum APIError: Error {
    case invalidURL
    case invalidResponse
    case decodingError
}

class API {
    static let shared = API()
    
    private let baseURL = URL(string: "https://jsonplaceholder.typicode.com")!
    
    func getUsers() -> AnyPublisher<[User], Error> {
        URLSession
            .shared
            .dataTaskPublisher(for: baseURL.appendingPathComponent("/users"))
            .map(\.data)
            .decode(type: [User].self, decoder: JSONDecoder())
            .eraseToAnyPublisher()
    }
}

func loadData {
    API
        .shared
        .getUsers()
        .assign(to: \.users, on: self)
        .store(in: &cancellables)
}

Utilisez Combine au lieu de async/await pour charger les données de votre application sur au moins 1 requête.

  • A vous de définir cancelables et de les annuler lorsque la vue est supprimée.
  • Utilisez .assign(to: \.homeFeed, on: self) plutôt qu’un .sink sur votre FeedState.

#Exercice 2

Utilisez Combine pour faire en sorte que le Feed charge les 12 prochaines images lorsque l’utilisateur arrive à la fin du ScrollView.