Wie aktualisiere ich einen SwiftData (Manual) -Fetch, wenn die Datenbank geändert wird?IOS

Programmierung für iOS
Anonymous
 Wie aktualisiere ich einen SwiftData (Manual) -Fetch, wenn die Datenbank geändert wird?

Post by Anonymous »

Kontext < /h2>
Ich hole eine große Anzahl von Gegenständen aus einem SwiftData-Speicher mit einem sich häufig verändernden Prädikat. Traditionelle @Query Setups lieferten nicht die Flexibilität, die ich wollte (insbesondere für das Rendern von Ladezuständen). Daher habe ich einen Hintergrund-Schauspieler erstellt, um die Daten abzurufen:
>

Code: Select all

@ModelActor
actor ThreadsafeBackgroundActor: Sendable {
func fetchData(_ predicate: Predicate? = nil) throws -> [CardView] {
let descriptor = if let p = predicate {
FetchDescriptor(predicate: p)
} else {
FetchDescriptor()
}
let cards = try context.fetch(descriptor)
return cards.map(CardView.init)
}
}
< /code>
Ich habe auch ein Ansichtsmodell erhalten, das den Schauspieler aufruft: < /p>
@Observable
class CardListViewModel {
enum State {
case idle
case loading
case failed(Error)
case loaded([CardView])
}

private(set) var state = State.idle

func fetchData(container: ModelContainer, predicate: Predicate) async throws -> [CardView] {
let service = ThreadsafeBackgroundActor(modelContainer: container)
return try await service.fetchData(predicate)
}

@MainActor func load(container: ModelContainer, filter: CardPredicate) async {
state = .loading

do {
let cards = try await fetchData(container: container, predicate: filter.predicate)
state = .loaded(cards)
} catch is CancellationError {
state = .idle
} catch {
state = .failed(error)
}
}
}
und ich habe eine Aufgabe auf meiner Swiftui-Ansicht, um die anfängliche Last zu starten:

Code: Select all

.task(id: cardFilter) { // Reloads whenever the card filter changes! Good!
viewModel.load(container: context.container, filter: cardFilter)
}
Dieses Setup funktioniert exzellent bis Aktionen in der Ansicht irgendetwas in der Datenbank aktualisieren. Modellcontext -Aktionen, z. context.insert () und context.delete () , lösen Sie meine Funktion "laden

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post