-
Nouveautés de SwiftData
Découvrez les dernières améliorations apportées à SwiftData. Nous vous montrons comment rendre persistants des types personnalisés et tiers à l'aide de Codable, et comment organiser les données récupérées en sections dans votre app SwiftUI. Nous explorons également comment observer les modifications du magasin de données où que vous soyez dans l'app à l'aide de ModelResultsObserver et HistoryObserver. Vous pouvez ainsi piloter des objets d'état puissants, intégrer le système à des architectures basées sur la délégation et réagir précisément aux mises à jour du modèle.
Chapitres
- 0:00 - Introduction
- 0:53 - Segmenter vos requêtes
- 2:56 - Utilisation de types personnalisés
- 6:26 - Observation des stores de données avec ResultsObserver
- 9:41 - Observer l’historique avec HistoryObserver
- 12:20 - Étapes suivantes
Ressources
Vidéos connexes
WWDC26
WWDC24
-
Rechercher dans cette vidéo…
-
-
0:01 - Sectioned fetching
// Sectioned fetching struct TripListView: View { @Query(sort: \Trip.startDate, sectionBy: \.destination) var trips: [Trip] var body: some View: { List(selection: $selection) { ForEach(_trips.sections) {section in Section(section.id) { ForEach(trips) {trip in TripListItem(trip: trip) } } } } } } -
4:59 - Using Codable
// Using Codable import SwiftData @Model class Trip { struct Location: Codable { var latitude: Double var longitude: Double } var name: String var destination: String var startDate: Date var endDate: Date var location: Location? @Attribute(.codable) var mapItemIdentifier: MKMapItem.Identifier? } -
8:20 - // Use observation to update map bounds
// Use observation to update map bounds @Observable @MainActor final class MapCameraController { private let resultsObserver: ResultsObserver<Trip, Never> var bounds: MapCameraBounds? private var token: ObservationTracking.Token? init(modelContext: ModelContext) throws { resultsObserver = try ResultsObserver<Trip, Never>(modelContext: modelContext) token = withContinuousObservation(options: [.didSet]) {[weak self], event in self?.bounds = self?.calculateBounds(trips: resultsObserver.results) } } private func calculateBounds(trips: [Trip]) -> MapCameraBounds? { / * */ } } -
8:21 - // Using HistoryObserver to sync with a server
// Using HistoryObserver to sync with a server @SyncActor final class ServerSync { private let observer: HistoryObserver private var token: ObservationTracking.Token? func start() throws { self.observer = try HistoryObserver(authors: ["App"], modelContainer: modelContainer) token = withContinuousObservation(options: .didSet) {[weak self] _ in _ = self?.observer.eventCounter self?.processChanges() } } private func processChanges() { // Fetch and process history transactions } }
-