Structures
The following structures are available globally.
-
A
From
clause specifies the source entity and source persistent store for fetch and query methods. A common usage is to just indicate the entity:let person = transaction.fetchOne(From<Person>())
For cases where multiple
NSPersistentStore
s contain the same entity, the source configuration’s name needs to be specified as well:
See morelet person = transaction.fetchOne(From<Person>("Configuration1"))
Declaration
Swift
public struct From<O> where O : DynamicObject
extension From: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The
See moreGroupBy
clause specifies that the result of a query be grouped accoording to the specified key path.Declaration
Swift
public struct GroupBy<O> : GroupByClause, QueryClause, Hashable where O : DynamicObject
extension GroupBy: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
An
Into
clause contains the destination entity and destination persistent store for acreate(...)
method. A common usage is to just indicate the entity:let person = transaction.create(Into<MyPersonEntity>())
For cases where multiple
NSPersistentStore
s contain the same entity, the destination configuration’s name needs to be specified as well:
See morelet person = transaction.create(Into<MyPersonEntity>("Configuration1"))
Declaration
Swift
public struct Into<O> : Hashable where O : DynamicObject
extension Into: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
A
ListSnapshot
holds a stable list ofDynamicObject
identifiers. This is typically created by aListPublisher
and are designed to work well withDiffableDataSource.TableViewAdapter
s andDiffableDataSource.CollectionViewAdapter
s. For detailed examples, see the documentation onDiffableDataSource.TableViewAdapter
andDiffableDataSource.CollectionViewAdapter
.While the
ListSnapshot
stores only object identifiers, all accessors to its items returnObjectPublisher
s, which are lazily created. For more details, see the documentation onListObject
.Since
See moreListSnapshot
is a value type, you can freely modify its items.Declaration
Swift
public struct ListSnapshot<O> : RandomAccessCollection, Hashable where O : DynamicObject
extension ListSnapshot: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The
See moreLocalStorageOptions
provides settings that tells theDataStack
how to setup the persistent store forLocalStorage
implementers.Declaration
Swift
public struct LocalStorageOptions : OptionSet, ExpressibleByNilLiteral
extension LocalStorageOptions: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
A
MigrationChain
indicates the sequence of model versions to be used as the order for progressive migrations. This is typically passed to theSchemaHistory
or theDataStack
initializer and will be applied to all stores added to theDataStack
withaddStorage(...)
and its variants.Initializing with empty values (either
nil
,[]
, or[:]
) instructs theDataStack
to use the .xcdatamodel’s current version as the final version, and to disable progressive migrations:let dataStack = DataStack(migrationChain: nil)
This means that the mapping model will be computed from the store’s version straight to the
DataStack
‘s model version. To support progressive migrations, specify the linear order of versions:let dataStack = DataStack(migrationChain: ["MyAppModel", "MyAppModelV2", "MyAppModelV3", "MyAppModelV4"])
or for more complex migration paths, a version tree that maps the key-values to the source-destination versions:
let dataStack = DataStack(migrationChain: [ "MyAppModel": "MyAppModelV3", "MyAppModelV2": "MyAppModelV4", "MyAppModelV3": "MyAppModelV4" ])
This allows for different migration paths depending on the starting version. The example above resolves to the following paths:
- MyAppModel-MyAppModelV3-MyAppModelV4
- MyAppModelV2-MyAppModelV4
- MyAppModelV3-MyAppModelV4
The
MigrationChain
is validated when passed to theDataStack
and unless it is empty, will raise an assertion if any of the following conditions are met:- a version appears twice in an array
- a version appears twice as a key in a dictionary literal
- a loop is found in any of the paths
Declaration
Swift
public struct MigrationChain : ExpressibleByNilLiteral, ExpressibleByStringLiteral, ExpressibleByDictionaryLiteral, ExpressibleByArrayLiteral, Equatable
extension MigrationChain: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The
See moreObjectSnapshot
is a full copy of aDynamicObject
‘s properties at a given point in time. This is useful especially when keeping thread-safe state values, in ViewModels for example. Since this is a value type, any changes in thisstruct
does not affect the actual object.Declaration
Swift
@dynamicMemberLookup public struct ObjectSnapshot<O> : ObjectRepresentation, Hashable where O : DynamicObject
extension ObjectSnapshot: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The
See moreOrderBy
clause specifies the sort order for results for a fetch or a query.Declaration
Swift
public struct OrderBy<O> : OrderByClause, FetchClause, QueryClause, DeleteClause, Hashable where O : DynamicObject
extension OrderBy: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
A
See morePartialObject
is only used when overriding getters and setters forCoreStoreObject
properties. Custom getters and setters are implemented as a closure that “overrides” the default property getter/setter. The closure receives aPartialObject<O>
, which acts as a fast, type-safe KVC interface forCoreStoreObject
. The reason aCoreStoreObject
instance is not passed directly is because the Core Data runtime is not aware ofCoreStoreObject
properties’ static typing, and so loading those info everytime KVO invokes this accessor method incurs a heavy performance hit (especially in KVO-heavy operations such asListMonitor
observing.) When accessing the property value fromPartialObject<O>
, make sure to usePartialObject<O>.persistentValue(for:)
instead ofPartialObject<O>.value(for:)
, which would unintentionally execute the same closure again recursively.Declaration
Swift
public struct PartialObject<O> where O : CoreStoreObject
extension PartialObject: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The
SectionBy
clause indicates the key path to use to group theListMonitor
objects into sections. An optional closure can also be provided to transform the value into an appropriate section index title:
See morelet monitor = dataStack.monitorSectionedList( From<Person>(), SectionBy("age") { "Age \($0)" }, OrderBy(.ascending("lastName")) )
Declaration
Swift
public struct SectionBy<O> where O : DynamicObject
extension SectionBy: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The
Select
clause indicates the attribute / aggregate value to be queried. The generic type is aSelectResultType
, and will be used as the return type for the query.You can bind the return type by specializing the initializer:
let maximumAge = dataStack.queryValue( From<MyPersonEntity>(), Select<Int>(.maximum("age")) )
or by casting the type of the return value:
let maximumAge: Int = dataStack.queryValue( From<MyPersonEntity>(), Select(.maximum("age")) )
Valid return types depend on the query:
- for
queryValue(...)
methods:- all types that conform to
QueryableAttributeType
protocol
- all types that conform to
for
queryAttributes(...)
methods:NSDictionary
Declaration
Swift
public struct Select<O, T> : SelectClause, Hashable where O : DynamicObject, T : SelectResultType
extension Select: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
Parameters
sortDescriptors
a series of
NSSortDescriptor
s - for
-
The
Tweak
clause allows fine-tuning theNSFetchRequest
for a fetch or query. Sample usage:
See morelet employees = transaction.fetchAll( From<MyPersonEntity>(), Tweak { (fetchRequest) -> Void in fetchRequest.includesPendingChanges = false fetchRequest.fetchLimit = 5 } )
Declaration
Swift
public struct Tweak : FetchClause, QueryClause, DeleteClause
extension Tweak: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The
See moreWhere
clause specifies the conditions for a fetch or a query.Declaration
Swift
public struct Where<O> : WhereClauseType, FetchClause, QueryClause, DeleteClause, Hashable where O : DynamicObject
extension Where: CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The
VersionLock
contains the version hashes for entities. This is then passed to theCoreStoreSchema
, which contains all entities for the store. An assertion will be raised if anyEntity
doesn’t match the version hash.
See moreclass Animal: CoreStoreObject { let species = Value.Required<String>("species", initial: "") let nickname = Value.Optional<String>("nickname") let master = Relationship.ToOne<Person>("master") } class Person: CoreStoreObject { let name = Value.Required<String>("name", initial: "") let pet = Relationship.ToOne<Animal>("pet", inverse: { $0.master }) } CoreStoreDefaults.dataStack = DataStack( CoreStoreSchema( modelVersion: "V1", entities: [ Entity<Animal>("Animal"), Entity<Person>("Person") ], versionLock: [ "Animal": [0x2698c812ebbc3b97, 0x751e3fa3f04cf9, 0x51fd460d3babc82, 0x92b4ba735b5a3053], "Person": [0xae4060a59f990ef0, 0x8ac83a6e1411c130, 0xa29fea58e2e38ab6, 0x2071bb7e33d77887] ] ) )
Declaration
Swift
public struct VersionLock : ExpressibleByDictionaryLiteral, Equatable
extension VersionLock: CustomStringConvertible, CustomDebugStringConvertible, CoreStoreDebugStringConvertible
-
The fetch builder type used for fetches. A
FetchChainBuilder
is created from aFrom
clause.
See morelet people = source.fetchAll( From<MyPersonEntity>() .where(\.age > 18) .orderBy(.ascending(\.age)) )
Declaration
Swift
public struct FetchChainBuilder<O> : FetchChainableBuilderType where O : DynamicObject
-
The fetch builder type used for a queries. A
QueryChainBuilder
is created from aFrom
clause and then aselect(...)
chain.
See morelet averageAdultAge = dataStack.queryValue( From<MyPersonEntity>() .select(Int.self, .average(\.age)) .where(\.age > 18) )
Declaration
Swift
public struct QueryChainBuilder<O, R> : QueryChainableBuilderType where O : DynamicObject, R : SelectResultType
-
The fetch builder type used for a sectioned
ListMonitor
. ASectionMonitorChainBuilder
is created from aFrom
clause and then asectionBy(...)
chain.
See morelet monitor = transaction.monitorSectionedList( From<MyPersonEntity>() .sectionBy(\.age, { "\($0!) years old" }) .where(\.age > 18) .orderBy(.ascending(\.age)) )
Declaration
Swift
public struct SectionMonitorChainBuilder<O> : SectionMonitorBuilderType where O : DynamicObject
-
A container view that reads list changes in a
See moreListPublisher
Declaration
Swift
public struct ListReader<Object, Content, Value> : View where Object : DynamicObject, Content : View
-
A property wrapper type that can read
See moreListPublisher
changes.Declaration
Swift
@propertyWrapper public struct ListState<Object> : DynamicProperty where Object : DynamicObject
-
An
See moreObjectProxy
is only used when overriding getters and setters forCoreStoreObject
properties. Custom getters and setters are implemented as a closure that “overrides” the default property getter/setter. The closure receives anObjectProxy<O>
, which acts as a fast, type-safe KVC interface forCoreStoreObject
. The reason aCoreStoreObject
instance is not passed directly is because the Core Data runtime is not aware ofCoreStoreObject
properties’ static typing, and so loading those info every time KVO invokes this accessor method incurs a heavy performance hit (especially in KVO-heavy operations such asListMonitor
observing.) When accessing the property value fromObjectProxy<O>
, make sure to useObjectProxy<O>.$property.primitiveValue
instead ofObjectProxy<O>.$property.value
, which would execute the same accessor again recursively.Declaration
Swift
@dynamicMemberLookup public struct ObjectProxy<O> where O : CoreStoreObject
-
A container view that reads changes to an
See moreObjectPublisher
Declaration
Swift
public struct ObjectReader<Object, Content, Placeholder, Value> : View where Object : DynamicObject, Content : View, Placeholder : View
-
A property wrapper type that can read
See moreObjectPublisher
changes.Declaration
Swift
@propertyWrapper public struct ObjectState<O> : DynamicProperty where O : DynamicObject