<!--
{
  "availability" : [
    "iOS: 27.0.0 -",
    "iPadOS: 27.0.0 -",
    "macCatalyst: 27.0.0 -",
    "macOS: 27.0.0 -",
    "tvOS: 27.0.0 -",
    "visionOS: 27.0.0 -",
    "watchOS: 27.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "SwiftData",
  "identifier" : "/documentation/SwiftData/ResultsObserver",
  "metadataVersion" : "0.1.0",
  "role" : "Class",
  "symbol" : {
    "kind" : "Class",
    "modules" : [
      "SwiftData"
    ],
    "preciseIdentifier" : "s:9SwiftData15ResultsObserverC"
  },
  "title" : "ResultsObserver"
}
-->

# ResultsObserver

Observes and tracks changes to a collection of persistent models in a model context.

```
final class ResultsObserver<Element, SectionTitle> where Element : PersistentModel, SectionTitle : Hashable
```

## Overview

`ResultsObserver` automatically monitors changes to models that match specified fetch criteria,
providing real-time updates when the underlying data changes. The observer maintains a collection
of fetched results, making it ideal for keeping user interfaces synchronized with persistent data.

The observer responds to changes from multiple sources:

- Local changes made within the same model context
- Remote changes from other contexts within the same container
- External changes from other processes or CloudKit sync

You can configure the observer using either a complete `FetchDescriptor` or individual
filter predicates and sort descriptors. The observer is `Observable`, allowing SwiftUI views
to automatically update when results change.

Use `Never` as the `SectionTitle` type parameter when no sectioning is needed:

```swift
let observer = try ResultsObserver<Book, Never>(
    filterBy: #Predicate { $0.isPublished },
    sortBy: [SortDescriptor(\.title)],
    modelContext: context
)
```

Use a concrete type (e.g. `String`) when sectioning by a key path of that type:

```swift
let observer = try ResultsObserver<Book, String>(
    sectionBy: \.genre,
    modelContext: context
)
```

## Topics

### Creating a results observer with a fetch descriptor

[`init(fetchDescriptor:modelContext:isolation:)`](/documentation/SwiftData/ResultsObserver/init(fetchDescriptor:modelContext:isolation:))

Creates a new unsectioned observer with the given fetch descriptor and model context.

[`init(fetchDescriptor:sectionBy:modelContext:isolation:)`](/documentation/SwiftData/ResultsObserver/init(fetchDescriptor:sectionBy:modelContext:isolation:)-7ms14)

Creates a new observer with the given fetch descriptor, a String section key path, and a model context.

[`init(fetchDescriptor:sectionBy:modelContext:isolation:)`](/documentation/SwiftData/ResultsObserver/init(fetchDescriptor:sectionBy:modelContext:isolation:)-9kg1q)

Creates a new observer with the given fetch descriptor, an optional String section key path, and a model context.

[`init(fetchDescriptor:modelContainer:isolation:)`](/documentation/SwiftData/ResultsObserver/init(fetchDescriptor:modelContainer:isolation:))

Creates a new unsectioned observer with the given fetch descriptor and model container.

[`init(fetchDescriptor:sectionBy:modelContainer:isolation:)`](/documentation/SwiftData/ResultsObserver/init(fetchDescriptor:sectionBy:modelContainer:isolation:)-4tuzk)

Creates a new observer with the given fetch descriptor, an optional String section key path, and a model container.

[`init(fetchDescriptor:sectionBy:modelContainer:isolation:)`](/documentation/SwiftData/ResultsObserver/init(fetchDescriptor:sectionBy:modelContainer:isolation:)-7wa5c)

Creates a new observer with the given fetch descriptor, a String section key path, and a model container.

### Creating a results observer with a predicate

[`init(filterBy:sortBy:modelContext:isolation:)`](/documentation/SwiftData/ResultsObserver/init(filterBy:sortBy:modelContext:isolation:))

Creates a new unsectioned observer with individual filter and sort criteria and a model context.

[`init(filterBy:sortBy:sectionBy:modelContext:isolation:)`](/documentation/SwiftData/ResultsObserver/init(filterBy:sortBy:sectionBy:modelContext:isolation:)-4ainb)

Creates a new observer with individual filter and sort criteria, an optional String section key path, and a model context.

[`init(filterBy:sortBy:sectionBy:modelContext:isolation:)`](/documentation/SwiftData/ResultsObserver/init(filterBy:sortBy:sectionBy:modelContext:isolation:)-gsuz)

Creates a new observer with individual filter and sort criteria, a String section key path, and a model context.

[`init(filterBy:sortBy:modelContainer:isolation:)`](/documentation/SwiftData/ResultsObserver/init(filterBy:sortBy:modelContainer:isolation:))

Creates a new unsectioned observer with individual filter and sort criteria and a model container.

[`init(filterBy:sortBy:sectionBy:modelContainer:isolation:)`](/documentation/SwiftData/ResultsObserver/init(filterBy:sortBy:sectionBy:modelContainer:isolation:)-5ufvn)

Creates a new observer with individual filter and sort criteria, a String section key path, and a model container.

[`init(filterBy:sortBy:sectionBy:modelContainer:isolation:)`](/documentation/SwiftData/ResultsObserver/init(filterBy:sortBy:sectionBy:modelContainer:isolation:)-9lfy0)

Creates a new observer with individual filter and sort criteria, an optional String section key path, and a model container.

### Accessing observer properties

[`fetchDescriptor`](/documentation/SwiftData/ResultsObserver/fetchDescriptor)

The fetch descriptor used to query the model context.

[`filterBy`](/documentation/SwiftData/ResultsObserver/filterBy)

The predicate used to filter which models are included in the results.

[`modelContext`](/documentation/SwiftData/ResultsObserver/modelContext)

The model context from which models are fetched.

[`sortBy`](/documentation/SwiftData/ResultsObserver/sortBy)

The sort descriptors used to order the results.

[`sectionBy`](/documentation/SwiftData/ResultsObserver/sectionBy)

The key path on the element used to determine section grouping.

[`sections`](/documentation/SwiftData/ResultsObserver/sections)

The sections computed from the current results, grouped by [`sectionBy`](/documentation/SwiftData/ResultsObserver/sectionBy).

### Accessing observer results

[`results`](/documentation/SwiftData/ResultsObserver/results)

The current collection of fetched models matching the fetch criteria.

[`element(at:)`](/documentation/SwiftData/ResultsObserver/element(at:))

Returns the element at the given index path in the sectioned results.

[`indexPath(for:)`](/documentation/SwiftData/ResultsObserver/indexPath(for:))

Returns the index path of the given element within the sectioned results.



---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)