Introduce FetchTask to tie database observation to view lifetime
#295
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Currently, the
@FetchAll,@FetchOne, and@Fetchproperty wrappers work the same way that SwiftData's@Queryproperty wrapper work: they observe and cause view updates as long as they are in the view hierarchy, regardless of if the view is visible or not. That means a list view powered by a@FetchAllwill continue to recompute even if you're drilled down into a detail screen.To work around this, you must explicitly stop observation, using events like
onDisappear:This PR introduces a new
FetchTasktype that is returned fromload, which you can optionallyawaitto tie the cancellation of the current Swift task to the database observation. To migrate to it from the above workaround:.task { - try? await $reminders.load(Reminder.order(by: \.isCompleted)) + try? await $reminders.load(Reminder.order(by: \.isCompleted)).task } -.onDisappear { - Task { try await $reminders.load(Reminder.none) } -}