Как обновить SwiftData (ручное) принесение всякий раз, когда изменяется база данных?IOS

Программируем под IOS
Ответить
Anonymous
 Как обновить SwiftData (ручное) принесение всякий раз, когда изменяется база данных?

Сообщение Anonymous »

контекст < /h2>
Я получаю большое количество элементов из хранилища SwiftData, используя часто меняющегося предиката. Традиционные @Query Настройки не предоставили той гибкости, которую я хотел (в частности, для рендеринга состояний загрузки), поэтому я создал фонового актера для обработки данных:

Код: Выделить всё

@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>
У меня также есть модель представления, называемая актером: < /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)
}
}
}
И у меня есть задача в моем представлении Swiftui, чтобы начать начальную нагрузку:

Код: Выделить всё

.task(id: cardFilter) { // Reloads whenever the card filter changes! Good!
viewModel.load(container: context.container, filter: cardFilter)
}
Эта настройка работает превосходно , пока что -либо в базе данных не изменится . Обновления базы данных (вставки, модификации, удаления) />
[*] Я попытался сделать маршрут грубой силы внедрения переменной reloadcount < /code> состояния, обойдясь везде, где это необходимо. Области кода, которые обновляют приращение базы данных RELOADCOUNT , и отдельную задачу в моем списке Просмотр Просмотр Смотрите счет:

Код: Выделить всё

.task(id: cardFilter) { /* Same call */ }
.task(id: reloadCount) { // Eww...
viewModel.load(container: context.container, filter: cardFilter)
}
Не только эта стратегия утомительна и хрупкая, но также не работает риск вызовой нагрузки несколько раз без необходимости (особенно во время первоначального рендеринга).

[*] Я рассмотрел систему потокового уведомления Swift. Я совершенно уверен, что nspersistentstoreremotechange - это то, что я хочу посмотреть. Я просто не могу понять, как/где инициализировать этого наблюдателя. AddObserver запрашивает аннотации Objective-C. Я не думаю, что .publisher (). Snin {} также является решением, потому что я хочу начать мутирующее вызов viewmodel.load () в (сбегающем) закрытии.



Подробнее здесь: https://stackoverflow.com/questions/797 ... is-changed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»