mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-04-19 07:29:44 +02:00
remov stateIDs
This commit is contained in:
Binary file not shown.
@@ -97,6 +97,10 @@
|
|||||||
B50392FA1C47963F009900CA /* NSManagedObject+Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50392F81C478FF3009900CA /* NSManagedObject+Transaction.swift */; };
|
B50392FA1C47963F009900CA /* NSManagedObject+Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50392F81C478FF3009900CA /* NSManagedObject+Transaction.swift */; };
|
||||||
B50392FB1C479640009900CA /* NSManagedObject+Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50392F81C478FF3009900CA /* NSManagedObject+Transaction.swift */; };
|
B50392FB1C479640009900CA /* NSManagedObject+Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50392F81C478FF3009900CA /* NSManagedObject+Transaction.swift */; };
|
||||||
B504D0D61B02362500B2BBB1 /* CoreStore+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B504D0D51B02362500B2BBB1 /* CoreStore+Setup.swift */; };
|
B504D0D61B02362500B2BBB1 /* CoreStore+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B504D0D51B02362500B2BBB1 /* CoreStore+Setup.swift */; };
|
||||||
|
B50564D32350CC3100482308 /* PropertyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50564D22350CC3100482308 /* PropertyProtocol.swift */; };
|
||||||
|
B50564D42350CC3100482308 /* PropertyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50564D22350CC3100482308 /* PropertyProtocol.swift */; };
|
||||||
|
B50564D52350CC3100482308 /* PropertyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50564D22350CC3100482308 /* PropertyProtocol.swift */; };
|
||||||
|
B50564D62350CC3100482308 /* PropertyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50564D22350CC3100482308 /* PropertyProtocol.swift */; };
|
||||||
B509C7F41E54511B0061C547 /* ImportableAttributeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509C7F31E54511B0061C547 /* ImportableAttributeType.swift */; };
|
B509C7F41E54511B0061C547 /* ImportableAttributeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509C7F31E54511B0061C547 /* ImportableAttributeType.swift */; };
|
||||||
B509C7F51E54511B0061C547 /* ImportableAttributeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509C7F31E54511B0061C547 /* ImportableAttributeType.swift */; };
|
B509C7F51E54511B0061C547 /* ImportableAttributeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509C7F31E54511B0061C547 /* ImportableAttributeType.swift */; };
|
||||||
B509C7F61E54511B0061C547 /* ImportableAttributeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509C7F31E54511B0061C547 /* ImportableAttributeType.swift */; };
|
B509C7F61E54511B0061C547 /* ImportableAttributeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509C7F31E54511B0061C547 /* ImportableAttributeType.swift */; };
|
||||||
@@ -280,6 +284,10 @@
|
|||||||
B53CA9A31EF1EF1600E0F440 /* PartialObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53CA9A11EF1EF1600E0F440 /* PartialObject.swift */; };
|
B53CA9A31EF1EF1600E0F440 /* PartialObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53CA9A11EF1EF1600E0F440 /* PartialObject.swift */; };
|
||||||
B53CA9A41EF1EF1600E0F440 /* PartialObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53CA9A11EF1EF1600E0F440 /* PartialObject.swift */; };
|
B53CA9A41EF1EF1600E0F440 /* PartialObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53CA9A11EF1EF1600E0F440 /* PartialObject.swift */; };
|
||||||
B53CA9A51EF1EF1600E0F440 /* PartialObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53CA9A11EF1EF1600E0F440 /* PartialObject.swift */; };
|
B53CA9A51EF1EF1600E0F440 /* PartialObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53CA9A11EF1EF1600E0F440 /* PartialObject.swift */; };
|
||||||
|
B53D9E5923513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53D9E5823513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift */; };
|
||||||
|
B53D9E5A23513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53D9E5823513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift */; };
|
||||||
|
B53D9E5B23513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53D9E5823513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift */; };
|
||||||
|
B53D9E5C23513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53D9E5823513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift */; };
|
||||||
B53FB9FE1CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53FB9FD1CAB2D2F00F0D40A /* CSMigrationResult.swift */; };
|
B53FB9FE1CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53FB9FD1CAB2D2F00F0D40A /* CSMigrationResult.swift */; };
|
||||||
B53FBA001CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53FB9FD1CAB2D2F00F0D40A /* CSMigrationResult.swift */; };
|
B53FBA001CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53FB9FD1CAB2D2F00F0D40A /* CSMigrationResult.swift */; };
|
||||||
B53FBA011CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53FB9FD1CAB2D2F00F0D40A /* CSMigrationResult.swift */; };
|
B53FBA011CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53FB9FD1CAB2D2F00F0D40A /* CSMigrationResult.swift */; };
|
||||||
@@ -376,6 +384,14 @@
|
|||||||
B559CD4B1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = B559CD481CAA8C6D00E4D58B /* CSStorageInterface.swift */; };
|
B559CD4B1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = B559CD481CAA8C6D00E4D58B /* CSStorageInterface.swift */; };
|
||||||
B559CD4C1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = B559CD481CAA8C6D00E4D58B /* CSStorageInterface.swift */; };
|
B559CD4C1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = B559CD481CAA8C6D00E4D58B /* CSStorageInterface.swift */; };
|
||||||
B559CD4D1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = B559CD481CAA8C6D00E4D58B /* CSStorageInterface.swift */; };
|
B559CD4D1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = B559CD481CAA8C6D00E4D58B /* CSStorageInterface.swift */; };
|
||||||
|
B55BB4D4235012AE00C33E34 /* ObjectRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B55BB4D3235012AE00C33E34 /* ObjectRepresentation.swift */; };
|
||||||
|
B55BB4D5235012AE00C33E34 /* ObjectRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B55BB4D3235012AE00C33E34 /* ObjectRepresentation.swift */; };
|
||||||
|
B55BB4D6235012AE00C33E34 /* ObjectRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B55BB4D3235012AE00C33E34 /* ObjectRepresentation.swift */; };
|
||||||
|
B55BB4D7235012AE00C33E34 /* ObjectRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B55BB4D3235012AE00C33E34 /* ObjectRepresentation.swift */; };
|
||||||
|
B55BB4D823503B9500C33E34 /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F849702348A6690029D57B /* EnvironmentKeys.swift */; };
|
||||||
|
B55BB4D923503B9600C33E34 /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F849702348A6690029D57B /* EnvironmentKeys.swift */; };
|
||||||
|
B55BB4DA23503B9600C33E34 /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F849702348A6690029D57B /* EnvironmentKeys.swift */; };
|
||||||
|
B55BB4DB23503B9700C33E34 /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F849702348A6690029D57B /* EnvironmentKeys.swift */; };
|
||||||
B56007111B3F6BD500A9A8F9 /* Into.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56007101B3F6BD500A9A8F9 /* Into.swift */; };
|
B56007111B3F6BD500A9A8F9 /* Into.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56007101B3F6BD500A9A8F9 /* Into.swift */; };
|
||||||
B56007141B3F6C2800A9A8F9 /* SectionBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56007131B3F6C2800A9A8F9 /* SectionBy.swift */; };
|
B56007141B3F6C2800A9A8F9 /* SectionBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56007131B3F6C2800A9A8F9 /* SectionBy.swift */; };
|
||||||
B56007161B4018AB00A9A8F9 /* MigrationChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56007151B4018AB00A9A8F9 /* MigrationChain.swift */; };
|
B56007161B4018AB00A9A8F9 /* MigrationChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56007151B4018AB00A9A8F9 /* MigrationChain.swift */; };
|
||||||
@@ -790,10 +806,6 @@
|
|||||||
B5F8496D234898240029D57B /* ListSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F8496B234898240029D57B /* ListSnapshot.swift */; };
|
B5F8496D234898240029D57B /* ListSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F8496B234898240029D57B /* ListSnapshot.swift */; };
|
||||||
B5F8496E234898240029D57B /* ListSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F8496B234898240029D57B /* ListSnapshot.swift */; };
|
B5F8496E234898240029D57B /* ListSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F8496B234898240029D57B /* ListSnapshot.swift */; };
|
||||||
B5F8496F234898240029D57B /* ListSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F8496B234898240029D57B /* ListSnapshot.swift */; };
|
B5F8496F234898240029D57B /* ListSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F8496B234898240029D57B /* ListSnapshot.swift */; };
|
||||||
B5F849712348A6690029D57B /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F849702348A6690029D57B /* EnvironmentKeys.swift */; };
|
|
||||||
B5F849722348A6690029D57B /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F849702348A6690029D57B /* EnvironmentKeys.swift */; };
|
|
||||||
B5F849732348A6690029D57B /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F849702348A6690029D57B /* EnvironmentKeys.swift */; };
|
|
||||||
B5F849742348A6690029D57B /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F849702348A6690029D57B /* EnvironmentKeys.swift */; };
|
|
||||||
B5FAD6A91B50A4B400714891 /* Progress+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FAD6A81B50A4B300714891 /* Progress+Convenience.swift */; };
|
B5FAD6A91B50A4B400714891 /* Progress+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FAD6A81B50A4B300714891 /* Progress+Convenience.swift */; };
|
||||||
B5FAD6AC1B51285300714891 /* Internals.MigrationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FAD6AB1B51285300714891 /* Internals.MigrationManager.swift */; };
|
B5FAD6AC1B51285300714891 /* Internals.MigrationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FAD6AB1B51285300714891 /* Internals.MigrationManager.swift */; };
|
||||||
B5FAD6AE1B518DCB00714891 /* CoreStore+Migration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FAD6AD1B518DCB00714891 /* CoreStore+Migration.swift */; };
|
B5FAD6AE1B518DCB00714891 /* CoreStore+Migration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FAD6AD1B518DCB00714891 /* CoreStore+Migration.swift */; };
|
||||||
@@ -864,6 +876,7 @@
|
|||||||
B501FDE61CA8D20500BE22EF /* CSListObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSListObserver.swift; sourceTree = "<group>"; };
|
B501FDE61CA8D20500BE22EF /* CSListObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSListObserver.swift; sourceTree = "<group>"; };
|
||||||
B50392F81C478FF3009900CA /* NSManagedObject+Transaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSManagedObject+Transaction.swift"; sourceTree = "<group>"; };
|
B50392F81C478FF3009900CA /* NSManagedObject+Transaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSManagedObject+Transaction.swift"; sourceTree = "<group>"; };
|
||||||
B504D0D51B02362500B2BBB1 /* CoreStore+Setup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CoreStore+Setup.swift"; sourceTree = "<group>"; };
|
B504D0D51B02362500B2BBB1 /* CoreStore+Setup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CoreStore+Setup.swift"; sourceTree = "<group>"; };
|
||||||
|
B50564D22350CC3100482308 /* PropertyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PropertyProtocol.swift; sourceTree = "<group>"; };
|
||||||
B509C7F31E54511B0061C547 /* ImportableAttributeType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportableAttributeType.swift; sourceTree = "<group>"; };
|
B509C7F31E54511B0061C547 /* ImportableAttributeType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportableAttributeType.swift; sourceTree = "<group>"; };
|
||||||
B50EE14123473C92009B8C47 /* CoreStoreObject+DataSources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CoreStoreObject+DataSources.swift"; sourceTree = "<group>"; };
|
B50EE14123473C92009B8C47 /* CoreStoreObject+DataSources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CoreStoreObject+DataSources.swift"; sourceTree = "<group>"; };
|
||||||
B512607E1E97A18000402229 /* CoreStoreObject+Convenience.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CoreStoreObject+Convenience.swift"; sourceTree = "<group>"; };
|
B512607E1E97A18000402229 /* CoreStoreObject+Convenience.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CoreStoreObject+Convenience.swift"; sourceTree = "<group>"; };
|
||||||
@@ -903,6 +916,7 @@
|
|||||||
B538BA701D15B3E30003A766 /* CoreStoreBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreStoreBridge.m; sourceTree = "<group>"; };
|
B538BA701D15B3E30003A766 /* CoreStoreBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreStoreBridge.m; sourceTree = "<group>"; };
|
||||||
B53B275E1EE3B92E00E9B352 /* CoreStoreManagedObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreStoreManagedObject.swift; sourceTree = "<group>"; };
|
B53B275E1EE3B92E00E9B352 /* CoreStoreManagedObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreStoreManagedObject.swift; sourceTree = "<group>"; };
|
||||||
B53CA9A11EF1EF1600E0F440 /* PartialObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartialObject.swift; sourceTree = "<group>"; };
|
B53CA9A11EF1EF1600E0F440 /* PartialObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartialObject.swift; sourceTree = "<group>"; };
|
||||||
|
B53D9E5823513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiffableDataSourceSnapshotProtocol.swift; sourceTree = "<group>"; };
|
||||||
B53FB9FD1CAB2D2F00F0D40A /* CSMigrationResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSMigrationResult.swift; sourceTree = "<group>"; };
|
B53FB9FD1CAB2D2F00F0D40A /* CSMigrationResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSMigrationResult.swift; sourceTree = "<group>"; };
|
||||||
B53FBA031CAB300C00F0D40A /* CSMigrationType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSMigrationType.swift; sourceTree = "<group>"; };
|
B53FBA031CAB300C00F0D40A /* CSMigrationType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSMigrationType.swift; sourceTree = "<group>"; };
|
||||||
B53FBA0A1CAB5E6500F0D40A /* CSCoreStore+Migrating.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CSCoreStore+Migrating.swift"; sourceTree = "<group>"; };
|
B53FBA0A1CAB5E6500F0D40A /* CSCoreStore+Migrating.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CSCoreStore+Migrating.swift"; sourceTree = "<group>"; };
|
||||||
@@ -931,6 +945,7 @@
|
|||||||
B55717421D15AF9C009BDBCA /* CoreStoreBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoreStoreBridge.h; sourceTree = "<group>"; };
|
B55717421D15AF9C009BDBCA /* CoreStoreBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoreStoreBridge.h; sourceTree = "<group>"; };
|
||||||
B559CD421CAA8B6300E4D58B /* CSSetupResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSSetupResult.swift; sourceTree = "<group>"; };
|
B559CD421CAA8B6300E4D58B /* CSSetupResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSSetupResult.swift; sourceTree = "<group>"; };
|
||||||
B559CD481CAA8C6D00E4D58B /* CSStorageInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSStorageInterface.swift; sourceTree = "<group>"; };
|
B559CD481CAA8C6D00E4D58B /* CSStorageInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSStorageInterface.swift; sourceTree = "<group>"; };
|
||||||
|
B55BB4D3235012AE00C33E34 /* ObjectRepresentation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectRepresentation.swift; sourceTree = "<group>"; };
|
||||||
B56007101B3F6BD500A9A8F9 /* Into.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Into.swift; sourceTree = "<group>"; };
|
B56007101B3F6BD500A9A8F9 /* Into.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Into.swift; sourceTree = "<group>"; };
|
||||||
B56007131B3F6C2800A9A8F9 /* SectionBy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionBy.swift; sourceTree = "<group>"; };
|
B56007131B3F6C2800A9A8F9 /* SectionBy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionBy.swift; sourceTree = "<group>"; };
|
||||||
B56007151B4018AB00A9A8F9 /* MigrationChain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationChain.swift; sourceTree = "<group>"; };
|
B56007151B4018AB00A9A8F9 /* MigrationChain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationChain.swift; sourceTree = "<group>"; };
|
||||||
@@ -1294,6 +1309,17 @@
|
|||||||
name = Observing;
|
name = Observing;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
B50564CC2350699700482308 /* Protocols */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B5831B6F1F34AC3400A9F647 /* AttributeProtocol.swift */,
|
||||||
|
B5831B741F34AC7A00A9F647 /* RelationshipProtocol.swift */,
|
||||||
|
B50564D22350CC3100482308 /* PropertyProtocol.swift */,
|
||||||
|
B53D9E5823513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift */,
|
||||||
|
);
|
||||||
|
name = Protocols;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
B51B5C2922D43854009FA3BA /* KeyPaths */ = {
|
B51B5C2922D43854009FA3BA /* KeyPaths */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1485,7 +1511,7 @@
|
|||||||
B56964D11B22FF700075EE4A /* Migrating */,
|
B56964D11B22FF700075EE4A /* Migrating */,
|
||||||
B5E5FA4C22D15D3C00330931 /* DataSources */,
|
B5E5FA4C22D15D3C00330931 /* DataSources */,
|
||||||
B5E84F261AFF84920064E85B /* Convenience */,
|
B5E84F261AFF84920064E85B /* Convenience */,
|
||||||
B5E84F291AFF849C0064E85B /* Internal */,
|
B5E84F291AFF849C0064E85B /* Internals */,
|
||||||
);
|
);
|
||||||
name = Swift;
|
name = Swift;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1550,6 +1576,7 @@
|
|||||||
B5BF7FC0234D7B2E0070E741 /* LiveObject.swift */,
|
B5BF7FC0234D7B2E0070E741 /* LiveObject.swift */,
|
||||||
B5F8496B234898240029D57B /* ListSnapshot.swift */,
|
B5F8496B234898240029D57B /* ListSnapshot.swift */,
|
||||||
B5BF7FC5234D7E460070E741 /* ObjectSnapshot.swift */,
|
B5BF7FC5234D7E460070E741 /* ObjectSnapshot.swift */,
|
||||||
|
B55BB4D3235012AE00C33E34 /* ObjectRepresentation.swift */,
|
||||||
B50EE14123473C92009B8C47 /* CoreStoreObject+DataSources.swift */,
|
B50EE14123473C92009B8C47 /* CoreStoreObject+DataSources.swift */,
|
||||||
B5D8CA752346E7590055D7D1 /* DataStack+DataSources.swift */,
|
B5D8CA752346E7590055D7D1 /* DataStack+DataSources.swift */,
|
||||||
B5F335572348D75D00FD649F /* LiveResult.swift */,
|
B5F335572348D75D00FD649F /* LiveResult.swift */,
|
||||||
@@ -1677,10 +1704,10 @@
|
|||||||
name = Convenience;
|
name = Convenience;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
B5E84F291AFF849C0064E85B /* Internal */ = {
|
B5E84F291AFF849C0064E85B /* Internals */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
B5831B6F1F34AC3400A9F647 /* AttributeProtocol.swift */,
|
B50564CC2350699700482308 /* Protocols */,
|
||||||
B53B275E1EE3B92E00E9B352 /* CoreStoreManagedObject.swift */,
|
B53B275E1EE3B92E00E9B352 /* CoreStoreManagedObject.swift */,
|
||||||
B533C4DA1D7D4BFA001383CB /* DispatchQueue+CoreStore.swift */,
|
B533C4DA1D7D4BFA001383CB /* DispatchQueue+CoreStore.swift */,
|
||||||
B5C976E61C6E3A5900B1AF90 /* Internals.CoreStoreFetchedResultsController.swift */,
|
B5C976E61C6E3A5900B1AF90 /* Internals.CoreStoreFetchedResultsController.swift */,
|
||||||
@@ -1708,9 +1735,8 @@
|
|||||||
B56923C81EB82410007C4DC9 /* NSManagedObjectModel+Migration.swift */,
|
B56923C81EB82410007C4DC9 /* NSManagedObjectModel+Migration.swift */,
|
||||||
B5FEC18D1C9166E200532541 /* NSPersistentStore+Setup.swift */,
|
B5FEC18D1C9166E200532541 /* NSPersistentStore+Setup.swift */,
|
||||||
B59AFF401C6593E400C0ABE2 /* NSPersistentStoreCoordinator+Setup.swift */,
|
B59AFF401C6593E400C0ABE2 /* NSPersistentStoreCoordinator+Setup.swift */,
|
||||||
B5831B741F34AC7A00A9F647 /* RelationshipProtocol.swift */,
|
|
||||||
);
|
);
|
||||||
name = Internal;
|
name = Internals;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
B5ECDBEA1CA6BEAC00C7F112 /* Protocol Clauses */ = {
|
B5ECDBEA1CA6BEAC00C7F112 /* Protocol Clauses */ = {
|
||||||
@@ -2033,6 +2059,7 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
B5DE5230230BDA1300A22534 /* Shared.swift in Sources */,
|
B5DE5230230BDA1300A22534 /* Shared.swift in Sources */,
|
||||||
|
B55BB4DB23503B9700C33E34 /* EnvironmentKeys.swift in Sources */,
|
||||||
B5E84F221AFF84860064E85B /* ObjectMonitor.swift in Sources */,
|
B5E84F221AFF84860064E85B /* ObjectMonitor.swift in Sources */,
|
||||||
B5ECDBF91CA804FD00C7F112 /* NSManagedObjectContext+ObjectiveC.swift in Sources */,
|
B5ECDBF91CA804FD00C7F112 /* NSManagedObjectContext+ObjectiveC.swift in Sources */,
|
||||||
B5CA2B081F7E5ACA004B1936 /* WhereClauseType.swift in Sources */,
|
B5CA2B081F7E5ACA004B1936 /* WhereClauseType.swift in Sources */,
|
||||||
@@ -2047,6 +2074,7 @@
|
|||||||
B56923FA1EB82956007C4DC9 /* CSXcodeDataModelSchema.swift in Sources */,
|
B56923FA1EB82956007C4DC9 /* CSXcodeDataModelSchema.swift in Sources */,
|
||||||
B55514EA1EED8BF900BAB888 /* From+Querying.swift in Sources */,
|
B55514EA1EED8BF900BAB888 /* From+Querying.swift in Sources */,
|
||||||
B596BBBB1DD5C39F001DCDD9 /* QueryableSource.swift in Sources */,
|
B596BBBB1DD5C39F001DCDD9 /* QueryableSource.swift in Sources */,
|
||||||
|
B55BB4D4235012AE00C33E34 /* ObjectRepresentation.swift in Sources */,
|
||||||
B5ECDBFF1CA80CBA00C7F112 /* CSWhere.swift in Sources */,
|
B5ECDBFF1CA80CBA00C7F112 /* CSWhere.swift in Sources */,
|
||||||
B5ECDC051CA8138100C7F112 /* CSOrderBy.swift in Sources */,
|
B5ECDC051CA8138100C7F112 /* CSOrderBy.swift in Sources */,
|
||||||
B5E1B5981CAA0C23007FD580 /* CSObjectObserver.swift in Sources */,
|
B5E1B5981CAA0C23007FD580 /* CSObjectObserver.swift in Sources */,
|
||||||
@@ -2072,13 +2100,13 @@
|
|||||||
B53FBA121CAB63CB00F0D40A /* Progress+ObjectiveC.swift in Sources */,
|
B53FBA121CAB63CB00F0D40A /* Progress+ObjectiveC.swift in Sources */,
|
||||||
B5831B751F34AC7A00A9F647 /* RelationshipProtocol.swift in Sources */,
|
B5831B751F34AC7A00A9F647 /* RelationshipProtocol.swift in Sources */,
|
||||||
B51B5C2D22D43E38009FA3BA /* KeyPath+KeyPaths.swift in Sources */,
|
B51B5C2D22D43E38009FA3BA /* KeyPath+KeyPaths.swift in Sources */,
|
||||||
|
B50564D32350CC3100482308 /* PropertyProtocol.swift in Sources */,
|
||||||
B5D8CA762346E7590055D7D1 /* DataStack+DataSources.swift in Sources */,
|
B5D8CA762346E7590055D7D1 /* DataStack+DataSources.swift in Sources */,
|
||||||
B5BF7FC1234D7B2E0070E741 /* LiveObject.swift in Sources */,
|
B5BF7FC1234D7B2E0070E741 /* LiveObject.swift in Sources */,
|
||||||
B5E1B5A81CAA49E2007FD580 /* CSDataStack+Migrating.swift in Sources */,
|
B5E1B5A81CAA49E2007FD580 /* CSDataStack+Migrating.swift in Sources */,
|
||||||
B50132302346B76E00FC238B /* Internals.FetchedDiffableDataSourceSnapshotDelegate.swift in Sources */,
|
B50132302346B76E00FC238B /* Internals.FetchedDiffableDataSourceSnapshotDelegate.swift in Sources */,
|
||||||
B5D339F11E94AF5800C880DE /* CoreStoreStrings.swift in Sources */,
|
B5D339F11E94AF5800C880DE /* CoreStoreStrings.swift in Sources */,
|
||||||
B56007161B4018AB00A9A8F9 /* MigrationChain.swift in Sources */,
|
B56007161B4018AB00A9A8F9 /* MigrationChain.swift in Sources */,
|
||||||
B5F849712348A6690029D57B /* EnvironmentKeys.swift in Sources */,
|
|
||||||
B5E1B59D1CAA2568007FD580 /* CSDataStack+Observing.swift in Sources */,
|
B5E1B59D1CAA2568007FD580 /* CSDataStack+Observing.swift in Sources */,
|
||||||
B5ECDC231CA81A3900C7F112 /* CSCoreStore+Querying.swift in Sources */,
|
B5ECDC231CA81A3900C7F112 /* CSCoreStore+Querying.swift in Sources */,
|
||||||
B549F6731E56A92800FBAB2D /* CoreDataNativeType.swift in Sources */,
|
B549F6731E56A92800FBAB2D /* CoreDataNativeType.swift in Sources */,
|
||||||
@@ -2187,6 +2215,7 @@
|
|||||||
B5FE4DA71C84FB4400FA6A91 /* InMemoryStore.swift in Sources */,
|
B5FE4DA71C84FB4400FA6A91 /* InMemoryStore.swift in Sources */,
|
||||||
B52F743D1E9B8724005F3DAC /* DynamicSchema.swift in Sources */,
|
B52F743D1E9B8724005F3DAC /* DynamicSchema.swift in Sources */,
|
||||||
B5E8A72021C1015300EF006A /* CoreStoreObject+Observing.swift in Sources */,
|
B5E8A72021C1015300EF006A /* CoreStoreObject+Observing.swift in Sources */,
|
||||||
|
B53D9E5923513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift in Sources */,
|
||||||
B5474D152227C08700B21FEC /* Internals.CoreStoreFetchRequest.swift in Sources */,
|
B5474D152227C08700B21FEC /* Internals.CoreStoreFetchRequest.swift in Sources */,
|
||||||
B56923FF1EB82976007C4DC9 /* CSUnsafeDataModelSchema.swift in Sources */,
|
B56923FF1EB82976007C4DC9 /* CSUnsafeDataModelSchema.swift in Sources */,
|
||||||
B5215CAE1FA4812500139E3A /* SectionMonitorBuilder.swift in Sources */,
|
B5215CAE1FA4812500139E3A /* SectionMonitorBuilder.swift in Sources */,
|
||||||
@@ -2267,6 +2296,7 @@
|
|||||||
B5BF7FC2234D7B2E0070E741 /* LiveObject.swift in Sources */,
|
B5BF7FC2234D7B2E0070E741 /* LiveObject.swift in Sources */,
|
||||||
B596BBBC1DD5C39F001DCDD9 /* QueryableSource.swift in Sources */,
|
B596BBBC1DD5C39F001DCDD9 /* QueryableSource.swift in Sources */,
|
||||||
B5ECDC011CA80CBA00C7F112 /* CSWhere.swift in Sources */,
|
B5ECDC011CA80CBA00C7F112 /* CSWhere.swift in Sources */,
|
||||||
|
B55BB4D5235012AE00C33E34 /* ObjectRepresentation.swift in Sources */,
|
||||||
B5ECDC071CA8138100C7F112 /* CSOrderBy.swift in Sources */,
|
B5ECDC071CA8138100C7F112 /* CSOrderBy.swift in Sources */,
|
||||||
B5E1B59A1CAA0C23007FD580 /* CSObjectObserver.swift in Sources */,
|
B5E1B59A1CAA0C23007FD580 /* CSObjectObserver.swift in Sources */,
|
||||||
B5519A601CA21954002BEF78 /* CSAsynchronousDataTransaction.swift in Sources */,
|
B5519A601CA21954002BEF78 /* CSAsynchronousDataTransaction.swift in Sources */,
|
||||||
@@ -2287,6 +2317,7 @@
|
|||||||
B5BF7FCC234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */,
|
B5BF7FCC234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */,
|
||||||
B5E294DE2349F8E7003E5956 /* SnapshotResult.swift in Sources */,
|
B5E294DE2349F8E7003E5956 /* SnapshotResult.swift in Sources */,
|
||||||
B5C976E41C6C9F9A00B1AF90 /* UnsafeDataTransaction+Observing.swift in Sources */,
|
B5C976E41C6C9F9A00B1AF90 /* UnsafeDataTransaction+Observing.swift in Sources */,
|
||||||
|
B50564D42350CC3100482308 /* PropertyProtocol.swift in Sources */,
|
||||||
B53FBA141CAB63CB00F0D40A /* Progress+ObjectiveC.swift in Sources */,
|
B53FBA141CAB63CB00F0D40A /* Progress+ObjectiveC.swift in Sources */,
|
||||||
B5831B761F34AC7A00A9F647 /* RelationshipProtocol.swift in Sources */,
|
B5831B761F34AC7A00A9F647 /* RelationshipProtocol.swift in Sources */,
|
||||||
B5BF7FB3234C97910070E741 /* DiffableDataSource.swift in Sources */,
|
B5BF7FB3234C97910070E741 /* DiffableDataSource.swift in Sources */,
|
||||||
@@ -2298,6 +2329,7 @@
|
|||||||
B509C7F51E54511B0061C547 /* ImportableAttributeType.swift in Sources */,
|
B509C7F51E54511B0061C547 /* ImportableAttributeType.swift in Sources */,
|
||||||
82BA18B31C4BBD3900A0916E /* ImportableUniqueObject.swift in Sources */,
|
82BA18B31C4BBD3900A0916E /* ImportableUniqueObject.swift in Sources */,
|
||||||
B50EE14323473C96009B8C47 /* CoreStoreObject+DataSources.swift in Sources */,
|
B50EE14323473C96009B8C47 /* CoreStoreObject+DataSources.swift in Sources */,
|
||||||
|
B55BB4DA23503B9600C33E34 /* EnvironmentKeys.swift in Sources */,
|
||||||
B5E1B5951CAA0C15007FD580 /* CSObjectMonitor.swift in Sources */,
|
B5E1B5951CAA0C15007FD580 /* CSObjectMonitor.swift in Sources */,
|
||||||
18166887232B9ED60097C275 /* String+KeyPaths.swift in Sources */,
|
18166887232B9ED60097C275 /* String+KeyPaths.swift in Sources */,
|
||||||
B5ECDC2B1CA81CC700C7F112 /* CSDataStack+Transaction.swift in Sources */,
|
B5ECDC2B1CA81CC700C7F112 /* CSDataStack+Transaction.swift in Sources */,
|
||||||
@@ -2322,6 +2354,7 @@
|
|||||||
B5519A5A1CA2008C002BEF78 /* CSBaseDataTransaction.swift in Sources */,
|
B5519A5A1CA2008C002BEF78 /* CSBaseDataTransaction.swift in Sources */,
|
||||||
B5ECDBE11CA6BB2B00C7F112 /* CSBaseDataTransaction+Querying.swift in Sources */,
|
B5ECDBE11CA6BB2B00C7F112 /* CSBaseDataTransaction+Querying.swift in Sources */,
|
||||||
82BA18C11C4BBD5300A0916E /* CoreStore+Observing.swift in Sources */,
|
82BA18C11C4BBD5300A0916E /* CoreStore+Observing.swift in Sources */,
|
||||||
|
B53D9E5A23513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift in Sources */,
|
||||||
82BA18BC1C4BBD4A00A0916E /* OrderBy.swift in Sources */,
|
82BA18BC1C4BBD4A00A0916E /* OrderBy.swift in Sources */,
|
||||||
82BA18B01C4BBD3100A0916E /* NSManagedObject+Transaction.swift in Sources */,
|
82BA18B01C4BBD3100A0916E /* NSManagedObject+Transaction.swift in Sources */,
|
||||||
B50132312346B76E00FC238B /* Internals.FetchedDiffableDataSourceSnapshotDelegate.swift in Sources */,
|
B50132312346B76E00FC238B /* Internals.FetchedDiffableDataSourceSnapshotDelegate.swift in Sources */,
|
||||||
@@ -2375,7 +2408,6 @@
|
|||||||
B5D33A021E96012400C880DE /* Relationship.swift in Sources */,
|
B5D33A021E96012400C880DE /* Relationship.swift in Sources */,
|
||||||
B559CD4B1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */,
|
B559CD4B1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */,
|
||||||
B56923CA1EB82410007C4DC9 /* NSManagedObjectModel+Migration.swift in Sources */,
|
B56923CA1EB82410007C4DC9 /* NSManagedObjectModel+Migration.swift in Sources */,
|
||||||
B5F849722348A6690029D57B /* EnvironmentKeys.swift in Sources */,
|
|
||||||
B56923E51EB827F5007C4DC9 /* CustomSchemaMappingProvider.swift in Sources */,
|
B56923E51EB827F5007C4DC9 /* CustomSchemaMappingProvider.swift in Sources */,
|
||||||
B58D0C641EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift in Sources */,
|
B58D0C641EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift in Sources */,
|
||||||
B533C4DC1D7D4BFA001383CB /* DispatchQueue+CoreStore.swift in Sources */,
|
B533C4DC1D7D4BFA001383CB /* DispatchQueue+CoreStore.swift in Sources */,
|
||||||
@@ -2483,6 +2515,7 @@
|
|||||||
B5BF7FC4234D7B2E0070E741 /* LiveObject.swift in Sources */,
|
B5BF7FC4234D7B2E0070E741 /* LiveObject.swift in Sources */,
|
||||||
B596BBBE1DD5C39F001DCDD9 /* QueryableSource.swift in Sources */,
|
B596BBBE1DD5C39F001DCDD9 /* QueryableSource.swift in Sources */,
|
||||||
B546F9601C9A12B800D5AC55 /* CSSQliteStore.swift in Sources */,
|
B546F9601C9A12B800D5AC55 /* CSSQliteStore.swift in Sources */,
|
||||||
|
B55BB4D7235012AE00C33E34 /* ObjectRepresentation.swift in Sources */,
|
||||||
B5ECDC0F1CA8161B00C7F112 /* CSGroupBy.swift in Sources */,
|
B5ECDC0F1CA8161B00C7F112 /* CSGroupBy.swift in Sources */,
|
||||||
B5ECDC211CA81A2100C7F112 /* CSDataStack+Querying.swift in Sources */,
|
B5ECDC211CA81A2100C7F112 /* CSDataStack+Querying.swift in Sources */,
|
||||||
B52DD1C21BE1F94600949AFE /* Internals.MigrationManager.swift in Sources */,
|
B52DD1C21BE1F94600949AFE /* Internals.MigrationManager.swift in Sources */,
|
||||||
@@ -2503,6 +2536,7 @@
|
|||||||
B5BF7FCE234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */,
|
B5BF7FCE234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */,
|
||||||
B5E294E02349F8E7003E5956 /* SnapshotResult.swift in Sources */,
|
B5E294E02349F8E7003E5956 /* SnapshotResult.swift in Sources */,
|
||||||
B52DD19E1BE1F92C00949AFE /* AsynchronousDataTransaction.swift in Sources */,
|
B52DD19E1BE1F92C00949AFE /* AsynchronousDataTransaction.swift in Sources */,
|
||||||
|
B50564D62350CC3100482308 /* PropertyProtocol.swift in Sources */,
|
||||||
B5831B781F34AC7A00A9F647 /* RelationshipProtocol.swift in Sources */,
|
B5831B781F34AC7A00A9F647 /* RelationshipProtocol.swift in Sources */,
|
||||||
B52DD1981BE1F92500949AFE /* CoreStore+Setup.swift in Sources */,
|
B52DD1981BE1F92500949AFE /* CoreStore+Setup.swift in Sources */,
|
||||||
B5BF7FB5234C97910070E741 /* DiffableDataSource.swift in Sources */,
|
B5BF7FB5234C97910070E741 /* DiffableDataSource.swift in Sources */,
|
||||||
@@ -2514,6 +2548,7 @@
|
|||||||
B509C7F71E54511B0061C547 /* ImportableAttributeType.swift in Sources */,
|
B509C7F71E54511B0061C547 /* ImportableAttributeType.swift in Sources */,
|
||||||
B5220E1F1D130810009BC71E /* CSListObserver.swift in Sources */,
|
B5220E1F1D130810009BC71E /* CSListObserver.swift in Sources */,
|
||||||
B50EE14523473C97009B8C47 /* CoreStoreObject+DataSources.swift in Sources */,
|
B50EE14523473C97009B8C47 /* CoreStoreObject+DataSources.swift in Sources */,
|
||||||
|
B55BB4D823503B9500C33E34 /* EnvironmentKeys.swift in Sources */,
|
||||||
B52DD1941BE1F92500949AFE /* CoreStore.swift in Sources */,
|
B52DD1941BE1F92500949AFE /* CoreStore.swift in Sources */,
|
||||||
18166889232B9ED80097C275 /* String+KeyPaths.swift in Sources */,
|
18166889232B9ED80097C275 /* String+KeyPaths.swift in Sources */,
|
||||||
B52DD1A61BE1F92F00949AFE /* BaseDataTransaction+Importing.swift in Sources */,
|
B52DD1A61BE1F92F00949AFE /* BaseDataTransaction+Importing.swift in Sources */,
|
||||||
@@ -2538,6 +2573,7 @@
|
|||||||
B5FE4DAF1C85D44E00FA6A91 /* SQLiteStore.swift in Sources */,
|
B5FE4DAF1C85D44E00FA6A91 /* SQLiteStore.swift in Sources */,
|
||||||
B52DD1C71BE1F94600949AFE /* NSManagedObjectContext+Querying.swift in Sources */,
|
B52DD1C71BE1F94600949AFE /* NSManagedObjectContext+Querying.swift in Sources */,
|
||||||
B52DD1C81BE1F94600949AFE /* NSManagedObjectContext+Setup.swift in Sources */,
|
B52DD1C81BE1F94600949AFE /* NSManagedObjectContext+Setup.swift in Sources */,
|
||||||
|
B53D9E5C23513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift in Sources */,
|
||||||
B52DD1C31BE1F94600949AFE /* Internals.NotificationObserver.swift in Sources */,
|
B52DD1C31BE1F94600949AFE /* Internals.NotificationObserver.swift in Sources */,
|
||||||
B52DD1A81BE1F93200949AFE /* DataStack+Querying.swift in Sources */,
|
B52DD1A81BE1F93200949AFE /* DataStack+Querying.swift in Sources */,
|
||||||
B50132332346B76E00FC238B /* Internals.FetchedDiffableDataSourceSnapshotDelegate.swift in Sources */,
|
B50132332346B76E00FC238B /* Internals.FetchedDiffableDataSourceSnapshotDelegate.swift in Sources */,
|
||||||
@@ -2591,7 +2627,6 @@
|
|||||||
B56923CC1EB82410007C4DC9 /* NSManagedObjectModel+Migration.swift in Sources */,
|
B56923CC1EB82410007C4DC9 /* NSManagedObjectModel+Migration.swift in Sources */,
|
||||||
B56923E71EB827F5007C4DC9 /* CustomSchemaMappingProvider.swift in Sources */,
|
B56923E71EB827F5007C4DC9 /* CustomSchemaMappingProvider.swift in Sources */,
|
||||||
B58D0C661EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift in Sources */,
|
B58D0C661EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift in Sources */,
|
||||||
B5F849742348A6690029D57B /* EnvironmentKeys.swift in Sources */,
|
|
||||||
B533C4DE1D7D4BFA001383CB /* DispatchQueue+CoreStore.swift in Sources */,
|
B533C4DE1D7D4BFA001383CB /* DispatchQueue+CoreStore.swift in Sources */,
|
||||||
B5220E141D130614009BC71E /* DataStack+Observing.swift in Sources */,
|
B5220E141D130614009BC71E /* DataStack+Observing.swift in Sources */,
|
||||||
B52DD1A21BE1F92C00949AFE /* CoreStore+Transaction.swift in Sources */,
|
B52DD1A21BE1F92C00949AFE /* CoreStore+Transaction.swift in Sources */,
|
||||||
@@ -2699,6 +2734,7 @@
|
|||||||
B5BF7FC3234D7B2E0070E741 /* LiveObject.swift in Sources */,
|
B5BF7FC3234D7B2E0070E741 /* LiveObject.swift in Sources */,
|
||||||
B596BBBD1DD5C39F001DCDD9 /* QueryableSource.swift in Sources */,
|
B596BBBD1DD5C39F001DCDD9 /* QueryableSource.swift in Sources */,
|
||||||
B5ECDC081CA8138100C7F112 /* CSOrderBy.swift in Sources */,
|
B5ECDC081CA8138100C7F112 /* CSOrderBy.swift in Sources */,
|
||||||
|
B55BB4D6235012AE00C33E34 /* ObjectRepresentation.swift in Sources */,
|
||||||
B5E1B59B1CAA0C23007FD580 /* CSObjectObserver.swift in Sources */,
|
B5E1B59B1CAA0C23007FD580 /* CSObjectObserver.swift in Sources */,
|
||||||
B5519A611CA21954002BEF78 /* CSAsynchronousDataTransaction.swift in Sources */,
|
B5519A611CA21954002BEF78 /* CSAsynchronousDataTransaction.swift in Sources */,
|
||||||
B5FE4DAE1C85D44E00FA6A91 /* SQLiteStore.swift in Sources */,
|
B5FE4DAE1C85D44E00FA6A91 /* SQLiteStore.swift in Sources */,
|
||||||
@@ -2719,6 +2755,7 @@
|
|||||||
B5BF7FCD234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */,
|
B5BF7FCD234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */,
|
||||||
B5E294DF2349F8E7003E5956 /* SnapshotResult.swift in Sources */,
|
B5E294DF2349F8E7003E5956 /* SnapshotResult.swift in Sources */,
|
||||||
B53FBA151CAB63CB00F0D40A /* Progress+ObjectiveC.swift in Sources */,
|
B53FBA151CAB63CB00F0D40A /* Progress+ObjectiveC.swift in Sources */,
|
||||||
|
B50564D52350CC3100482308 /* PropertyProtocol.swift in Sources */,
|
||||||
B5E1B5AB1CAA49E2007FD580 /* CSDataStack+Migrating.swift in Sources */,
|
B5E1B5AB1CAA49E2007FD580 /* CSDataStack+Migrating.swift in Sources */,
|
||||||
B5831B771F34AC7A00A9F647 /* RelationshipProtocol.swift in Sources */,
|
B5831B771F34AC7A00A9F647 /* RelationshipProtocol.swift in Sources */,
|
||||||
B5BF7FB4234C97910070E741 /* DiffableDataSource.swift in Sources */,
|
B5BF7FB4234C97910070E741 /* DiffableDataSource.swift in Sources */,
|
||||||
@@ -2730,6 +2767,7 @@
|
|||||||
B509C7F61E54511B0061C547 /* ImportableAttributeType.swift in Sources */,
|
B509C7F61E54511B0061C547 /* ImportableAttributeType.swift in Sources */,
|
||||||
B5E1B5961CAA0C15007FD580 /* CSObjectMonitor.swift in Sources */,
|
B5E1B5961CAA0C15007FD580 /* CSObjectMonitor.swift in Sources */,
|
||||||
B50EE14423473C97009B8C47 /* CoreStoreObject+DataSources.swift in Sources */,
|
B50EE14423473C97009B8C47 /* CoreStoreObject+DataSources.swift in Sources */,
|
||||||
|
B55BB4D923503B9600C33E34 /* EnvironmentKeys.swift in Sources */,
|
||||||
B5ECDC2C1CA81CC700C7F112 /* CSDataStack+Transaction.swift in Sources */,
|
B5ECDC2C1CA81CC700C7F112 /* CSDataStack+Transaction.swift in Sources */,
|
||||||
18166888232B9ED70097C275 /* String+KeyPaths.swift in Sources */,
|
18166888232B9ED70097C275 /* String+KeyPaths.swift in Sources */,
|
||||||
B56321911BD65216006C9394 /* BaseDataTransaction+Importing.swift in Sources */,
|
B56321911BD65216006C9394 /* BaseDataTransaction+Importing.swift in Sources */,
|
||||||
@@ -2754,6 +2792,7 @@
|
|||||||
B5519A5B1CA2008C002BEF78 /* CSBaseDataTransaction.swift in Sources */,
|
B5519A5B1CA2008C002BEF78 /* CSBaseDataTransaction.swift in Sources */,
|
||||||
B5ECDBE21CA6BB2B00C7F112 /* CSBaseDataTransaction+Querying.swift in Sources */,
|
B5ECDBE21CA6BB2B00C7F112 /* CSBaseDataTransaction+Querying.swift in Sources */,
|
||||||
B56321971BD65216006C9394 /* Select.swift in Sources */,
|
B56321971BD65216006C9394 /* Select.swift in Sources */,
|
||||||
|
B53D9E5B23513712000F48FB /* DiffableDataSourceSnapshotProtocol.swift in Sources */,
|
||||||
B56321AB1BD6521C006C9394 /* Internals.FetchedResultsControllerDelegate.swift in Sources */,
|
B56321AB1BD6521C006C9394 /* Internals.FetchedResultsControllerDelegate.swift in Sources */,
|
||||||
B563219C1BD65216006C9394 /* SectionBy.swift in Sources */,
|
B563219C1BD65216006C9394 /* SectionBy.swift in Sources */,
|
||||||
B50132322346B76E00FC238B /* Internals.FetchedDiffableDataSourceSnapshotDelegate.swift in Sources */,
|
B50132322346B76E00FC238B /* Internals.FetchedDiffableDataSourceSnapshotDelegate.swift in Sources */,
|
||||||
@@ -2807,7 +2846,6 @@
|
|||||||
B5215CA61FA47DFD00139E3A /* FetchChainBuilder.swift in Sources */,
|
B5215CA61FA47DFD00139E3A /* FetchChainBuilder.swift in Sources */,
|
||||||
B5D33A031E96012400C880DE /* Relationship.swift in Sources */,
|
B5D33A031E96012400C880DE /* Relationship.swift in Sources */,
|
||||||
B559CD4C1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */,
|
B559CD4C1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */,
|
||||||
B5F849732348A6690029D57B /* EnvironmentKeys.swift in Sources */,
|
|
||||||
B56923CB1EB82410007C4DC9 /* NSManagedObjectModel+Migration.swift in Sources */,
|
B56923CB1EB82410007C4DC9 /* NSManagedObjectModel+Migration.swift in Sources */,
|
||||||
B56923E61EB827F5007C4DC9 /* CustomSchemaMappingProvider.swift in Sources */,
|
B56923E61EB827F5007C4DC9 /* CustomSchemaMappingProvider.swift in Sources */,
|
||||||
B58D0C651EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift in Sources */,
|
B58D0C651EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift in Sources */,
|
||||||
|
|||||||
@@ -41,18 +41,6 @@
|
|||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
<Testables>
|
|
||||||
<TestableReference
|
|
||||||
skipped = "NO">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "2F03A53A19C5C6DA005002A5"
|
|
||||||
BuildableName = "CoreStoreTests.xctest"
|
|
||||||
BlueprintName = "CoreStoreTests iOS"
|
|
||||||
ReferencedContainer = "container:CoreStore.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</TestableReference>
|
|
||||||
</Testables>
|
|
||||||
<MacroExpansion>
|
<MacroExpansion>
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
@@ -69,6 +57,18 @@
|
|||||||
isEnabled = "YES">
|
isEnabled = "YES">
|
||||||
</AdditionalOption>
|
</AdditionalOption>
|
||||||
</AdditionalOptions>
|
</AdditionalOptions>
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "2F03A53A19C5C6DA005002A5"
|
||||||
|
BuildableName = "CoreStoreTests.xctest"
|
||||||
|
BlueprintName = "CoreStoreTests iOS"
|
||||||
|
ReferencedContainer = "container:CoreStore.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
</TestAction>
|
</TestAction>
|
||||||
<LaunchAction
|
<LaunchAction
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
@@ -95,8 +95,6 @@
|
|||||||
isEnabled = "NO">
|
isEnabled = "NO">
|
||||||
</CommandLineArgument>
|
</CommandLineArgument>
|
||||||
</CommandLineArguments>
|
</CommandLineArguments>
|
||||||
<AdditionalOptions>
|
|
||||||
</AdditionalOptions>
|
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
<ProfileAction
|
<ProfileAction
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
|
|||||||
@@ -288,6 +288,7 @@
|
|||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
B54AAD481AF4D26E00848AE0 = {
|
B54AAD481AF4D26E00848AE0 = {
|
||||||
CreatedOnToolsVersion = 6.3;
|
CreatedOnToolsVersion = 6.3;
|
||||||
|
DevelopmentTeam = 2JT32EJ5BH;
|
||||||
LastSwiftMigration = 0900;
|
LastSwiftMigration = 0900;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -493,6 +494,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
DEVELOPMENT_TEAM = 2JT32EJ5BH;
|
||||||
INFOPLIST_FILE = CoreStoreDemo/Info.plist;
|
INFOPLIST_FILE = CoreStoreDemo/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.johnestropia.corestore.demo;
|
PRODUCT_BUNDLE_IDENTIFIER = com.johnestropia.corestore.demo;
|
||||||
@@ -505,6 +507,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
DEVELOPMENT_TEAM = 2JT32EJ5BH;
|
||||||
INFOPLIST_FILE = CoreStoreDemo/Info.plist;
|
INFOPLIST_FILE = CoreStoreDemo/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.johnestropia.corestore.demo;
|
PRODUCT_BUNDLE_IDENTIFIER = com.johnestropia.corestore.demo;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import CoreStore
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
import Compression
|
||||||
final class SwiftUIContainerViewController: UIViewController {
|
final class SwiftUIContainerViewController: UIViewController {
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
|
|||||||
@@ -60,25 +60,48 @@ struct SwiftUIView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.navigationBarTitle(Text("SwiftUI"))
|
.navigationBarTitle(Text("SwiftUI (\(palettes.numberOfItems) objects)"))
|
||||||
.navigationBarItems(
|
.navigationBarItems(
|
||||||
leading: EditButton(),
|
leading: EditButton(),
|
||||||
trailing: Button(
|
trailing: HStack {
|
||||||
action: {
|
Button(
|
||||||
|
action: {
|
||||||
|
|
||||||
self.dataStack.perform(
|
self.dataStack.perform(
|
||||||
asynchronous: { transaction in
|
asynchronous: { transaction in
|
||||||
|
|
||||||
let palette = transaction.create(Into<Palette>())
|
for palette in try transaction.fetchAll(From<Palette>()) {
|
||||||
palette.setInitialValues(in: transaction)
|
|
||||||
},
|
palette.hue .= Palette.randomHue()
|
||||||
completion: { _ in }
|
palette.colorName .= nil
|
||||||
)
|
}
|
||||||
},
|
},
|
||||||
label: {
|
completion: { _ in }
|
||||||
Image(systemName: "plus")
|
)
|
||||||
}
|
},
|
||||||
)
|
label: {
|
||||||
|
Image(systemName: "goforward")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.frame(width: 30)
|
||||||
|
Button(
|
||||||
|
action: {
|
||||||
|
|
||||||
|
self.dataStack.perform(
|
||||||
|
asynchronous: { transaction in
|
||||||
|
|
||||||
|
let palette = transaction.create(Into<Palette>())
|
||||||
|
palette.setInitialValues(in: transaction)
|
||||||
|
},
|
||||||
|
completion: { _ in }
|
||||||
|
)
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
Image(systemName: "plus")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.frame(width: 30)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
.alert(
|
.alert(
|
||||||
isPresented: $needsShowAlert,
|
isPresented: $needsShowAlert,
|
||||||
|
|||||||
@@ -164,24 +164,72 @@ class DynamicModelTests: BaseTestDataTestCase {
|
|||||||
|
|
||||||
animal.color .= .yellow
|
animal.color .= .yellow
|
||||||
XCTAssertEqual(animal.color.value, Color.yellow)
|
XCTAssertEqual(animal.color.value, Color.yellow)
|
||||||
|
|
||||||
|
for property in Animal.metaProperties(includeSuperclasses: true) {
|
||||||
|
|
||||||
|
switch property.keyPath {
|
||||||
|
|
||||||
|
case String(keyPath: \Animal.species):
|
||||||
|
XCTAssertTrue(property is ValueContainer<Animal>.Required<String>)
|
||||||
|
|
||||||
|
case String(keyPath: \Animal.master):
|
||||||
|
XCTAssertTrue(property is RelationshipContainer<Animal>.ToOne<Person>)
|
||||||
|
|
||||||
|
case String(keyPath: \Animal.color):
|
||||||
|
XCTAssertTrue(property is TransformableContainer<Animal>.Optional<Color>)
|
||||||
|
|
||||||
|
default:
|
||||||
|
XCTFail("Unknown KeyPath: \"\(property.keyPath)\"")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let dog = transaction.create(Into<Dog>())
|
let dog = transaction.create(Into<Dog>())
|
||||||
XCTAssertEqual(dog.species.value, "Swift")
|
XCTAssertEqual(dog.species.value, "Swift")
|
||||||
XCTAssertEqual(dog.nickname.value, nil)
|
XCTAssertEqual(dog.nickname.value, nil)
|
||||||
XCTAssertEqual(dog.age.value, 1)
|
XCTAssertEqual(dog.age.value, 1)
|
||||||
|
|
||||||
#if swift(>=5.1)
|
for property in Dog.metaProperties(includeSuperclasses: true) {
|
||||||
|
|
||||||
let dogKeyPathBuilder = Dog.keyPathBuilder()
|
switch property.keyPath {
|
||||||
XCTAssertEqual(dogKeyPathBuilder.species.keyPathString, "SELF.species")
|
|
||||||
XCTAssertEqual(dogKeyPathBuilder.master.title.keyPathString, "SELF.master.title")
|
|
||||||
let a = dogKeyPathBuilder.master
|
|
||||||
let b = dogKeyPathBuilder.master.spouse
|
|
||||||
let c = dogKeyPathBuilder.master.spouse.pets
|
|
||||||
let d = dogKeyPathBuilder.master.spouse.pets.color
|
|
||||||
XCTAssertEqual(dogKeyPathBuilder.master.spouse.pets.color.keyPathString, "SELF.master.spouse.pets.color")
|
|
||||||
|
|
||||||
#endif
|
case String(keyPath: \Dog.species):
|
||||||
|
XCTAssertTrue(property is ValueContainer<Animal>.Required<String>)
|
||||||
|
|
||||||
|
case String(keyPath: \Dog.master):
|
||||||
|
XCTAssertTrue(property is RelationshipContainer<Animal>.ToOne<Person>)
|
||||||
|
|
||||||
|
case String(keyPath: \Dog.color):
|
||||||
|
XCTAssertTrue(property is TransformableContainer<Animal>.Optional<Color>)
|
||||||
|
|
||||||
|
case String(keyPath: \Dog.nickname):
|
||||||
|
XCTAssertTrue(property is ValueContainer<Dog>.Optional<String>)
|
||||||
|
|
||||||
|
case String(keyPath: \Dog.age):
|
||||||
|
XCTAssertTrue(property is ValueContainer<Dog>.Required<Int>)
|
||||||
|
|
||||||
|
case String(keyPath: \Dog.friends):
|
||||||
|
XCTAssertTrue(property is RelationshipContainer<Dog>.ToManyOrdered<Dog>)
|
||||||
|
|
||||||
|
case String(keyPath: \Dog.friendedBy):
|
||||||
|
XCTAssertTrue(property is RelationshipContainer<Dog>.ToManyUnordered<Dog>)
|
||||||
|
|
||||||
|
default:
|
||||||
|
XCTFail("Unknown KeyPath: \"\(property.keyPath)\"")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// #if swift(>=5.1)
|
||||||
|
//
|
||||||
|
// let dogKeyPathBuilder = Dog.keyPathBuilder()
|
||||||
|
// XCTAssertEqual(dogKeyPathBuilder.species.keyPathString, "SELF.species")
|
||||||
|
// XCTAssertEqual(dogKeyPathBuilder.master.title.keyPathString, "SELF.master.title")
|
||||||
|
// let a = dogKeyPathBuilder.master
|
||||||
|
// let b = dogKeyPathBuilder.master.spouse
|
||||||
|
// let c = dogKeyPathBuilder.master.spouse.pets
|
||||||
|
// let d = dogKeyPathBuilder.master.spouse.pets.color
|
||||||
|
// XCTAssertEqual(dogKeyPathBuilder.master.spouse.pets.color.keyPathString, "SELF.master.spouse.pets.color")
|
||||||
|
//
|
||||||
|
// #endif
|
||||||
|
|
||||||
let didSetObserver = dog.species.observe(options: [.new, .old]) { (object, change) in
|
let didSetObserver = dog.species.observe(options: [.new, .old]) { (object, change) in
|
||||||
|
|
||||||
@@ -244,22 +292,22 @@ class DynamicModelTests: BaseTestDataTestCase {
|
|||||||
XCTAssertEqual(person.name.value, "John")
|
XCTAssertEqual(person.name.value, "John")
|
||||||
XCTAssertEqual(person.displayName.value, "Mr. John") // Custom getter
|
XCTAssertEqual(person.displayName.value, "Mr. John") // Custom getter
|
||||||
|
|
||||||
let personSnapshot1 = person.createSnapshot()
|
// let personSnapshot1 = person.createSnapshot()
|
||||||
XCTAssertEqual(person.name.value, personSnapshot1.name)
|
// XCTAssertEqual(person.name.value, personSnapshot1.name)
|
||||||
XCTAssertEqual(person.title.value, personSnapshot1.title)
|
// XCTAssertEqual(person.title.value, personSnapshot1.title)
|
||||||
XCTAssertEqual(person.displayName.value, personSnapshot1.displayName)
|
// XCTAssertEqual(person.displayName.value, personSnapshot1.displayName)
|
||||||
|
|
||||||
person.title .= "Sir"
|
person.title .= "Sir"
|
||||||
XCTAssertEqual(person.displayName.value, "Sir John")
|
XCTAssertEqual(person.displayName.value, "Sir John")
|
||||||
|
|
||||||
XCTAssertEqual(personSnapshot1.name, "John")
|
// XCTAssertEqual(personSnapshot1.name, "John")
|
||||||
XCTAssertEqual(personSnapshot1.title, "Mr.")
|
// XCTAssertEqual(personSnapshot1.title, "Mr.")
|
||||||
XCTAssertEqual(personSnapshot1.displayName, "Mr. John")
|
// XCTAssertEqual(personSnapshot1.displayName, "Mr. John")
|
||||||
|
|
||||||
let personSnapshot2 = person.createSnapshot()
|
// let personSnapshot2 = person.createSnapshot()
|
||||||
XCTAssertEqual(person.name.value, personSnapshot2.name)
|
// XCTAssertEqual(person.name.value, personSnapshot2.name)
|
||||||
XCTAssertEqual(person.title.value, personSnapshot2.title)
|
// XCTAssertEqual(person.title.value, personSnapshot2.title)
|
||||||
XCTAssertEqual(person.displayName.value, personSnapshot2.displayName)
|
// XCTAssertEqual(person.displayName.value, personSnapshot2.displayName)
|
||||||
|
|
||||||
person.pets.value.insert(dog)
|
person.pets.value.insert(dog)
|
||||||
XCTAssertEqual(person.pets.count, 1)
|
XCTAssertEqual(person.pets.count, 1)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ import CoreStore
|
|||||||
|
|
||||||
// MARK: - LiveListTests
|
// MARK: - LiveListTests
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
class LiveListTests: BaseTestDataTestCase {
|
class LiveListTests: BaseTestDataTestCase {
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
|
|||||||
@@ -29,11 +29,10 @@ import CoreData
|
|||||||
|
|
||||||
// MARK: - AttributeProtocol
|
// MARK: - AttributeProtocol
|
||||||
|
|
||||||
internal protocol AttributeProtocol: AnyObject {
|
internal protocol AttributeProtocol: PropertyProtocol {
|
||||||
|
|
||||||
static var attributeType: NSAttributeType { get }
|
static var attributeType: NSAttributeType { get }
|
||||||
|
|
||||||
var keyPath: KeyPathString { get }
|
|
||||||
var isOptional: Bool { get }
|
var isOptional: Bool { get }
|
||||||
var isTransient: Bool { get }
|
var isTransient: Bool { get }
|
||||||
var allowsExternalBinaryDataStorage: Bool { get }
|
var allowsExternalBinaryDataStorage: Bool { get }
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import Combine
|
|||||||
|
|
||||||
// MARK: - LiveList: ObservableObject
|
// MARK: - LiveList: ObservableObject
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
extension CoreStoreObject: ObservableObject {
|
extension CoreStoreObject: ObservableObject {
|
||||||
|
|
||||||
// MARK: ObservableObject
|
// MARK: ObservableObject
|
||||||
|
|||||||
@@ -116,6 +116,27 @@ open /*abstract*/ class CoreStoreObject: DynamicObject, Hashable {
|
|||||||
|
|
||||||
internal let rawObject: CoreStoreManagedObject?
|
internal let rawObject: CoreStoreManagedObject?
|
||||||
internal let isMeta: Bool
|
internal let isMeta: Bool
|
||||||
|
|
||||||
|
internal class func metaProperties(includeSuperclasses: Bool) -> [PropertyProtocol] {
|
||||||
|
|
||||||
|
func keyPaths(_ allKeyPaths: inout [PropertyProtocol], for dynamicType: CoreStoreObject.Type) {
|
||||||
|
|
||||||
|
allKeyPaths.append(contentsOf: dynamicType.meta.propertyProtocolsByName())
|
||||||
|
guard
|
||||||
|
includeSuperclasses,
|
||||||
|
case let superType as CoreStoreObject.Type = (dynamicType as AnyClass).superclass(),
|
||||||
|
superType != CoreStoreObject.self
|
||||||
|
else {
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
keyPaths(&allKeyPaths, for: superType)
|
||||||
|
}
|
||||||
|
|
||||||
|
var allKeyPaths: [PropertyProtocol] = []
|
||||||
|
keyPaths(&allKeyPaths, for: self)
|
||||||
|
return allKeyPaths
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: Private
|
// MARK: Private
|
||||||
@@ -144,6 +165,22 @@ open /*abstract*/ class CoreStoreObject: DynamicObject, Hashable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func propertyProtocolsByName() -> [PropertyProtocol] {
|
||||||
|
|
||||||
|
Internals.assert(self.isMeta, "'propertyProtocolsByName()' accessed from non-meta instance of \(Internals.typeName(self))")
|
||||||
|
|
||||||
|
let cacheKey = ObjectIdentifier(Self.self)
|
||||||
|
if let properties = Static.propertiesCache[cacheKey] {
|
||||||
|
|
||||||
|
return properties
|
||||||
|
}
|
||||||
|
let values: [PropertyProtocol] = Mirror(reflecting: self)
|
||||||
|
.children
|
||||||
|
.compactMap({ $0.value as? PropertyProtocol })
|
||||||
|
Static.propertiesCache[cacheKey] = values
|
||||||
|
return values
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -187,4 +224,5 @@ fileprivate enum Static {
|
|||||||
// MARK: FilePrivate
|
// MARK: FilePrivate
|
||||||
|
|
||||||
fileprivate static var metaCache: [ObjectIdentifier: Any] = [:]
|
fileprivate static var metaCache: [ObjectIdentifier: Any] = [:]
|
||||||
|
fileprivate static var propertiesCache: [ObjectIdentifier: [PropertyProtocol]] = [:]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -283,9 +283,9 @@ public final class CoreStoreSchema: DynamicSchema {
|
|||||||
func createProperties(for type: CoreStoreObject.Type) -> [NSPropertyDescription] {
|
func createProperties(for type: CoreStoreObject.Type) -> [NSPropertyDescription] {
|
||||||
|
|
||||||
var propertyDescriptions: [NSPropertyDescription] = []
|
var propertyDescriptions: [NSPropertyDescription] = []
|
||||||
for child in Mirror(reflecting: type.meta).children {
|
for property in type.metaProperties(includeSuperclasses: false) {
|
||||||
|
|
||||||
switch child.value {
|
switch property {
|
||||||
|
|
||||||
case let attribute as AttributeProtocol:
|
case let attribute as AttributeProtocol:
|
||||||
Internals.assert(
|
Internals.assert(
|
||||||
@@ -378,9 +378,10 @@ public final class CoreStoreSchema: DynamicSchema {
|
|||||||
for (entity, entityDescription) in entityDescriptionsByEntity {
|
for (entity, entityDescription) in entityDescriptionsByEntity {
|
||||||
|
|
||||||
let relationshipsByName = relationshipsByNameByEntity[entity]!
|
let relationshipsByName = relationshipsByNameByEntity[entity]!
|
||||||
for child in Mirror(reflecting: (entity.type as! CoreStoreObject.Type).meta).children {
|
let entityType = entity.type as! CoreStoreObject.Type
|
||||||
|
for property in entityType.metaProperties(includeSuperclasses: false) {
|
||||||
|
|
||||||
switch child.value {
|
switch property {
|
||||||
|
|
||||||
case let relationship as RelationshipProtocol:
|
case let relationship as RelationshipProtocol:
|
||||||
let (destinationType, destinationKeyPath) = relationship.inverse
|
let (destinationType, destinationKeyPath) = relationship.inverse
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import CoreData
|
|||||||
|
|
||||||
// MARK: - DataStack
|
// MARK: - DataStack
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
extension DataStack {
|
extension DataStack {
|
||||||
|
|
||||||
public func liveList<D>(_ from: From<D>, _ fetchClauses: FetchClause...) -> LiveList<D> {
|
public func liveList<D>(_ from: From<D>, _ fetchClauses: FetchClause...) -> LiveList<D> {
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ import CoreData
|
|||||||
// self.tableView = tableView
|
// self.tableView = tableView
|
||||||
// self.cellProvider = cellProvider
|
// self.cellProvider = cellProvider
|
||||||
//
|
//
|
||||||
// if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *) {
|
// if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) {
|
||||||
//
|
//
|
||||||
// self.rawDataSource = UITableViewDiffableDataSource<String, D.ObjectID>(
|
// self.rawDataSource = UITableViewDiffableDataSource<String, D.ObjectID>(
|
||||||
// tableView: tableView,
|
// tableView: tableView,
|
||||||
@@ -71,7 +71,7 @@ import CoreData
|
|||||||
// public func apply(_ snapshot: ListSnapshot<ObjectType>, animatingDifferences: Bool = true) {
|
// public func apply(_ snapshot: ListSnapshot<ObjectType>, animatingDifferences: Bool = true) {
|
||||||
//
|
//
|
||||||
// let dataSource = UITableViewDiffableDataSource<String, D>.
|
// let dataSource = UITableViewDiffableDataSource<String, D>.
|
||||||
// if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *) {
|
// if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) {
|
||||||
//
|
//
|
||||||
// self.rawDataSource! as! UITableViewDiffableDataSource<String, D>
|
// self.rawDataSource! as! UITableViewDiffableDataSource<String, D>
|
||||||
//
|
//
|
||||||
@@ -95,7 +95,7 @@ import CoreData
|
|||||||
// private let cellProvider: (UITableView, IndexPath, ObjectType) -> UITableViewCell?
|
// private let cellProvider: (UITableView, IndexPath, ObjectType) -> UITableViewCell?
|
||||||
// private let rawDataSource: Any?
|
// private let rawDataSource: Any?
|
||||||
//
|
//
|
||||||
// @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
// @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
// private var diffableDataSource: UITableViewDiffableDataSource<String, D.ObjectID> {
|
// private var diffableDataSource: UITableViewDiffableDataSource<String, D.ObjectID> {
|
||||||
//
|
//
|
||||||
// return self.rawDataSource! as! UITableViewDiffableDataSource<String, D.ObjectID>
|
// return self.rawDataSource! as! UITableViewDiffableDataSource<String, D.ObjectID>
|
||||||
|
|||||||
34
Sources/DiffableDataSourceSnapshotProtocol.swift
Normal file
34
Sources/DiffableDataSourceSnapshotProtocol.swift
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// DiffableDataSourceSnapshotProtocol.swift
|
||||||
|
// CoreStore
|
||||||
|
//
|
||||||
|
// Copyright © 2018 John Rommel Estropia
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: - DiffableDataSourceSnapshotProtocol
|
||||||
|
|
||||||
|
internal protocol DiffableDataSourceSnapshotProtocol {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -74,10 +74,10 @@ extension DynamicObject {
|
|||||||
|
|
||||||
// MARK: Internal
|
// MARK: Internal
|
||||||
|
|
||||||
internal static func keyPathBuilder() -> DynamicObjectMeta<Never, Self> {
|
// internal static func keyPathBuilder() -> DynamicObjectMeta<Never, Self> {
|
||||||
|
//
|
||||||
return .init(keyPathString: "SELF")
|
// return .init(keyPathString: "SELF")
|
||||||
}
|
// }
|
||||||
|
|
||||||
internal func runtimeType() -> Self.Type {
|
internal func runtimeType() -> Self.Type {
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,25 @@
|
|||||||
// EnvironmentKeys.swift
|
// EnvironmentKeys.swift
|
||||||
// CoreStore
|
// CoreStore
|
||||||
//
|
//
|
||||||
// Created by John Rommel Estropia on 2019/10/05.
|
// Copyright © 2018 John Rommel Estropia
|
||||||
// Copyright © 2019 John Rommel Estropia. All rights reserved.
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
//
|
//
|
||||||
|
|
||||||
#if canImport(SwiftUI)
|
#if canImport(SwiftUI)
|
||||||
@@ -13,7 +30,7 @@ import SwiftUI
|
|||||||
|
|
||||||
// MARK: - DataStackEnvironmentKey
|
// MARK: - DataStackEnvironmentKey
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
public struct DataStackEnvironmentKey: EnvironmentKey {
|
public struct DataStackEnvironmentKey: EnvironmentKey {
|
||||||
|
|
||||||
// MARK: Public
|
// MARK: Public
|
||||||
@@ -27,7 +44,7 @@ public struct DataStackEnvironmentKey: EnvironmentKey {
|
|||||||
|
|
||||||
// MARK: - EnvironmentValues
|
// MARK: - EnvironmentValues
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
extension EnvironmentValues {
|
extension EnvironmentValues {
|
||||||
|
|
||||||
// MARK: Public
|
// MARK: Public
|
||||||
|
|||||||
@@ -48,18 +48,14 @@ extension Internals {
|
|||||||
|
|
||||||
// MARK: Internal
|
// MARK: Internal
|
||||||
|
|
||||||
internal let nextStateTag: UUID
|
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
|
||||||
self.structure = .init()
|
self.structure = .init()
|
||||||
self.nextStateTag = .init()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init(sections: [NSFetchedResultsSectionInfo], previousStateTag: UUID, nextStateTag: UUID) {
|
init(sections: [NSFetchedResultsSectionInfo]) {
|
||||||
|
|
||||||
self.structure = .init(sections: sections, previousStateTag: previousStateTag)
|
self.structure = .init(sections: sections)
|
||||||
self.nextStateTag = nextStateTag
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var numberOfItems: Int {
|
var numberOfItems: Int {
|
||||||
@@ -77,21 +73,11 @@ extension Internals {
|
|||||||
return self.structure.allSectionIDs
|
return self.structure.allSectionIDs
|
||||||
}
|
}
|
||||||
|
|
||||||
var allSectionStateIDs: [SectionStateID] {
|
|
||||||
|
|
||||||
return self.structure.allSectionStateIDs
|
|
||||||
}
|
|
||||||
|
|
||||||
var allItemIDs: [NSManagedObjectID] {
|
var allItemIDs: [NSManagedObjectID] {
|
||||||
|
|
||||||
return self.structure.allItemIDs
|
return self.structure.allItemIDs
|
||||||
}
|
}
|
||||||
|
|
||||||
var allItemStateIDs: [ItemStateID] {
|
|
||||||
|
|
||||||
return self.structure.allItemStateIDs
|
|
||||||
}
|
|
||||||
|
|
||||||
func numberOfItems(inSection identifier: String) -> Int {
|
func numberOfItems(inSection identifier: String) -> Int {
|
||||||
|
|
||||||
return self.itemIDs(inSection: identifier).count
|
return self.itemIDs(inSection: identifier).count
|
||||||
@@ -102,21 +88,11 @@ extension Internals {
|
|||||||
return self.structure.items(in: identifier)
|
return self.structure.items(in: identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
func itemStateIDs(inSection identifier: String) -> [ItemStateID] {
|
|
||||||
|
|
||||||
return self.structure.itemStateIDs(in: identifier)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sectionIDs(containingItem identifier: NSManagedObjectID) -> String? {
|
func sectionIDs(containingItem identifier: NSManagedObjectID) -> String? {
|
||||||
|
|
||||||
return self.structure.section(containing: identifier)
|
return self.structure.section(containing: identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
func sectionStateIDs(containingItem identifier: NSManagedObjectID) -> SectionStateID? {
|
|
||||||
|
|
||||||
return self.structure.sectionStateID(containing: identifier)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indexOfItemID(_ identifier: NSManagedObjectID) -> Int? {
|
func indexOfItemID(_ identifier: NSManagedObjectID) -> Int? {
|
||||||
|
|
||||||
return self.structure.allItemIDs.firstIndex(of: identifier)
|
return self.structure.allItemIDs.firstIndex(of: identifier)
|
||||||
@@ -127,24 +103,19 @@ extension Internals {
|
|||||||
return self.structure.allSectionIDs.firstIndex(of: identifier)
|
return self.structure.allSectionIDs.firstIndex(of: identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
func itemIDs(where stateCondition: @escaping (UUID) -> Bool) -> [NSManagedObjectID] {
|
mutating func appendItems(_ identifiers: [NSManagedObjectID], toSection sectionIdentifier: String?) {
|
||||||
|
|
||||||
return self.structure.itemsIDs(where: stateCondition)
|
self.structure.append(itemIDs: identifiers, to: sectionIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func appendItems(_ identifiers: [NSManagedObjectID], toSection sectionIdentifier: String?, nextStateTag: UUID) {
|
mutating func insertItems(_ identifiers: [NSManagedObjectID], beforeItem beforeIdentifier: NSManagedObjectID) {
|
||||||
|
|
||||||
self.structure.append(itemIDs: identifiers, to: sectionIdentifier, nextStateTag: nextStateTag)
|
self.structure.insert(itemIDs: identifiers, before: beforeIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func insertItems(_ identifiers: [NSManagedObjectID], beforeItem beforeIdentifier: NSManagedObjectID, nextStateTag: UUID) {
|
mutating func insertItems(_ identifiers: [NSManagedObjectID], afterItem afterIdentifier: NSManagedObjectID) {
|
||||||
|
|
||||||
self.structure.insert(itemIDs: identifiers, before: beforeIdentifier, nextStateTag: nextStateTag)
|
self.structure.insert(itemIDs: identifiers, after: afterIdentifier)
|
||||||
}
|
|
||||||
|
|
||||||
mutating func insertItems(_ identifiers: [NSManagedObjectID], afterItem afterIdentifier: NSManagedObjectID, nextStateTag: UUID) {
|
|
||||||
|
|
||||||
self.structure.insert(itemIDs: identifiers, after: afterIdentifier, nextStateTag: nextStateTag)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func deleteItems(_ identifiers: [NSManagedObjectID]) {
|
mutating func deleteItems(_ identifiers: [NSManagedObjectID]) {
|
||||||
@@ -172,19 +143,19 @@ extension Internals {
|
|||||||
self.structure.update(itemIDs: identifiers, nextStateTag: nextStateTag)
|
self.structure.update(itemIDs: identifiers, nextStateTag: nextStateTag)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func appendSections(_ identifiers: [String], nextStateTag: UUID) {
|
mutating func appendSections(_ identifiers: [String]) {
|
||||||
|
|
||||||
self.structure.append(sectionIDs: identifiers, nextStateTag: nextStateTag)
|
self.structure.append(sectionIDs: identifiers)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func insertSections(_ identifiers: [String], beforeSection toIdentifier: String, nextStateTag: UUID) {
|
mutating func insertSections(_ identifiers: [String], beforeSection toIdentifier: String) {
|
||||||
|
|
||||||
self.structure.insert(sectionIDs: identifiers, before: toIdentifier, nextStateTag: nextStateTag)
|
self.structure.insert(sectionIDs: identifiers, before: toIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func insertSections(_ identifiers: [String], afterSection toIdentifier: String, nextStateTag: UUID) {
|
mutating func insertSections(_ identifiers: [String], afterSection toIdentifier: String) {
|
||||||
|
|
||||||
self.structure.insert(sectionIDs: identifiers, after: toIdentifier, nextStateTag: nextStateTag)
|
self.structure.insert(sectionIDs: identifiers, after: toIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func deleteSections(_ identifiers: [String]) {
|
mutating func deleteSections(_ identifiers: [String]) {
|
||||||
@@ -271,7 +242,7 @@ extension Internals {
|
|||||||
self.sections = []
|
self.sections = []
|
||||||
}
|
}
|
||||||
|
|
||||||
init(sections: [NSFetchedResultsSectionInfo], previousStateTag: UUID) {
|
init(sections: [NSFetchedResultsSectionInfo]) {
|
||||||
|
|
||||||
self.sections = sections.map {
|
self.sections = sections.map {
|
||||||
|
|
||||||
@@ -279,8 +250,7 @@ extension Internals {
|
|||||||
id: $0.name,
|
id: $0.name,
|
||||||
items: $0.objects?
|
items: $0.objects?
|
||||||
.compactMap({ ($0 as? NSManagedObject)?.objectID })
|
.compactMap({ ($0 as? NSManagedObject)?.objectID })
|
||||||
.map({ Item(id: $0, stateTag: previousStateTag) }) ?? [],
|
.map({ Item(id: $0) }) ?? []
|
||||||
stateTag: previousStateTag
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -290,21 +260,11 @@ extension Internals {
|
|||||||
return self.sections.map({ $0.id })
|
return self.sections.map({ $0.id })
|
||||||
}
|
}
|
||||||
|
|
||||||
var allSectionStateIDs: [SectionStateID] {
|
|
||||||
|
|
||||||
return self.sections.map({ $0.stateID })
|
|
||||||
}
|
|
||||||
|
|
||||||
var allItemIDs: [NSManagedObjectID] {
|
var allItemIDs: [NSManagedObjectID] {
|
||||||
|
|
||||||
return self.sections.lazy.flatMap({ $0.elements }).map({ $0.id })
|
return self.sections.lazy.flatMap({ $0.elements }).map({ $0.id })
|
||||||
}
|
}
|
||||||
|
|
||||||
var allItemStateIDs: [ItemStateID] {
|
|
||||||
|
|
||||||
return self.sections.lazy.flatMap({ $0.elements }).map({ $0.stateID })
|
|
||||||
}
|
|
||||||
|
|
||||||
func items(in sectionID: String) -> [NSManagedObjectID] {
|
func items(in sectionID: String) -> [NSManagedObjectID] {
|
||||||
|
|
||||||
guard let sectionIndex = self.sectionIndex(of: sectionID) else {
|
guard let sectionIndex = self.sectionIndex(of: sectionID) else {
|
||||||
@@ -314,33 +274,12 @@ extension Internals {
|
|||||||
return self.sections[sectionIndex].elements.map({ $0.id })
|
return self.sections[sectionIndex].elements.map({ $0.id })
|
||||||
}
|
}
|
||||||
|
|
||||||
func itemsIDs(where stateCondition: @escaping (UUID) -> Bool) -> [NSManagedObjectID] {
|
|
||||||
|
|
||||||
return self.sections.lazy
|
|
||||||
.flatMap({ $0.elements.filter({ stateCondition($0.stateTag) }) })
|
|
||||||
.map({ $0.id })
|
|
||||||
}
|
|
||||||
|
|
||||||
func itemStateIDs(in sectionID: String) -> [ItemStateID] {
|
|
||||||
|
|
||||||
guard let sectionIndex = self.sectionIndex(of: sectionID) else {
|
|
||||||
|
|
||||||
Internals.abort("Section \"\(sectionID)\" does not exist")
|
|
||||||
}
|
|
||||||
return self.sections[sectionIndex].elements.map({ $0.stateID })
|
|
||||||
}
|
|
||||||
|
|
||||||
func section(containing itemID: NSManagedObjectID) -> String? {
|
func section(containing itemID: NSManagedObjectID) -> String? {
|
||||||
|
|
||||||
return self.itemPositionMap()[itemID]?.section.id
|
return self.itemPositionMap()[itemID]?.section.id
|
||||||
}
|
}
|
||||||
|
|
||||||
func sectionStateID(containing itemID: NSManagedObjectID) -> SectionStateID? {
|
mutating func append(itemIDs: [NSManagedObjectID], to sectionID: String?) {
|
||||||
|
|
||||||
return self.itemPositionMap()[itemID]?.section.stateID
|
|
||||||
}
|
|
||||||
|
|
||||||
mutating func append(itemIDs: [NSManagedObjectID], to sectionID: String?, nextStateTag: UUID) {
|
|
||||||
|
|
||||||
let index: Array<Section>.Index
|
let index: Array<Section>.Index
|
||||||
if let sectionID = sectionID {
|
if let sectionID = sectionID {
|
||||||
@@ -360,22 +299,22 @@ extension Internals {
|
|||||||
}
|
}
|
||||||
index = section.index(before: section.endIndex)
|
index = section.index(before: section.endIndex)
|
||||||
}
|
}
|
||||||
let items = itemIDs.lazy.map({ Item(id: $0, stateTag: nextStateTag) })
|
let items = itemIDs.lazy.map({ Item(id: $0) })
|
||||||
self.sections[index].elements.append(contentsOf: items)
|
self.sections[index].elements.append(contentsOf: items)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func insert(itemIDs: [NSManagedObjectID], before beforeItemID: NSManagedObjectID, nextStateTag: UUID) {
|
mutating func insert(itemIDs: [NSManagedObjectID], before beforeItemID: NSManagedObjectID) {
|
||||||
|
|
||||||
guard let itemPosition = self.itemPositionMap()[beforeItemID] else {
|
guard let itemPosition = self.itemPositionMap()[beforeItemID] else {
|
||||||
|
|
||||||
Internals.abort("Item \(beforeItemID) does not exist")
|
Internals.abort("Item \(beforeItemID) does not exist")
|
||||||
}
|
}
|
||||||
let items = itemIDs.lazy.map({ Item(id: $0, stateTag: nextStateTag) })
|
let items = itemIDs.lazy.map({ Item(id: $0) })
|
||||||
self.sections[itemPosition.sectionIndex].elements
|
self.sections[itemPosition.sectionIndex].elements
|
||||||
.insert(contentsOf: items, at: itemPosition.itemRelativeIndex)
|
.insert(contentsOf: items, at: itemPosition.itemRelativeIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func insert(itemIDs: [NSManagedObjectID], after afterItemID: NSManagedObjectID, nextStateTag: UUID) {
|
mutating func insert(itemIDs: [NSManagedObjectID], after afterItemID: NSManagedObjectID) {
|
||||||
|
|
||||||
guard let itemPosition = self.itemPositionMap()[afterItemID] else {
|
guard let itemPosition = self.itemPositionMap()[afterItemID] else {
|
||||||
|
|
||||||
@@ -383,7 +322,7 @@ extension Internals {
|
|||||||
}
|
}
|
||||||
let itemIndex = self.sections[itemPosition.sectionIndex].elements
|
let itemIndex = self.sections[itemPosition.sectionIndex].elements
|
||||||
.index(after: itemPosition.itemRelativeIndex)
|
.index(after: itemPosition.itemRelativeIndex)
|
||||||
let items = itemIDs.lazy.map({ Item(id: $0, stateTag: nextStateTag) })
|
let items = itemIDs.lazy.map({ Item(id: $0) })
|
||||||
self.sections[itemPosition.sectionIndex].elements
|
self.sections[itemPosition.sectionIndex].elements
|
||||||
.insert(contentsOf: items, at: itemIndex)
|
.insert(contentsOf: items, at: itemIndex)
|
||||||
}
|
}
|
||||||
@@ -459,34 +398,34 @@ extension Internals {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
self.sections[itemPosition.sectionIndex]
|
self.sections[itemPosition.sectionIndex]
|
||||||
.elements[itemPosition.itemRelativeIndex].stateTag = nextStateTag
|
.elements[itemPosition.itemRelativeIndex].isReloaded = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func append(sectionIDs: [String], nextStateTag: UUID) {
|
mutating func append(sectionIDs: [String]) {
|
||||||
|
|
||||||
let newSections = sectionIDs.lazy.map({ Section(id: $0, stateTag: nextStateTag) })
|
let newSections = sectionIDs.lazy.map({ Section(id: $0) })
|
||||||
self.sections.append(contentsOf: newSections)
|
self.sections.append(contentsOf: newSections)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func insert(sectionIDs: [String], before beforeSectionID: String, nextStateTag: UUID) {
|
mutating func insert(sectionIDs: [String], before beforeSectionID: String) {
|
||||||
|
|
||||||
guard let sectionIndex = self.sectionIndex(of: beforeSectionID) else {
|
guard let sectionIndex = self.sectionIndex(of: beforeSectionID) else {
|
||||||
|
|
||||||
Internals.abort("Section \"\(beforeSectionID)\" does not exist")
|
Internals.abort("Section \"\(beforeSectionID)\" does not exist")
|
||||||
}
|
}
|
||||||
let newSections = sectionIDs.lazy.map({ Section(id: $0, stateTag: nextStateTag) })
|
let newSections = sectionIDs.lazy.map({ Section(id: $0) })
|
||||||
self.sections.insert(contentsOf: newSections, at: sectionIndex)
|
self.sections.insert(contentsOf: newSections, at: sectionIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func insert(sectionIDs: [String], after afterSectionID: String, nextStateTag: UUID) {
|
mutating func insert(sectionIDs: [String], after afterSectionID: String) {
|
||||||
|
|
||||||
guard let beforeIndex = self.sectionIndex(of: afterSectionID) else {
|
guard let beforeIndex = self.sectionIndex(of: afterSectionID) else {
|
||||||
|
|
||||||
Internals.abort("Section \"\(afterSectionID)\" does not exist")
|
Internals.abort("Section \"\(afterSectionID)\" does not exist")
|
||||||
}
|
}
|
||||||
let sectionIndex = self.sections.index(after: beforeIndex)
|
let sectionIndex = self.sections.index(after: beforeIndex)
|
||||||
let newSections = sectionIDs.lazy.map({ Section(id: $0, stateTag: nextStateTag) })
|
let newSections = sectionIDs.lazy.map({ Section(id: $0) })
|
||||||
self.sections.insert(contentsOf: newSections, at: sectionIndex)
|
self.sections.insert(contentsOf: newSections, at: sectionIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -533,7 +472,7 @@ extension Internals {
|
|||||||
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
self.sections[sectionIndex].stateTag = nextStateTag
|
self.sections[sectionIndex].isReloaded = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -589,22 +528,17 @@ extension Internals {
|
|||||||
|
|
||||||
fileprivate struct Item: Identifiable, Equatable {
|
fileprivate struct Item: Identifiable, Equatable {
|
||||||
|
|
||||||
var stateTag: UUID
|
var isReloaded: Bool
|
||||||
|
|
||||||
init(id: NSManagedObjectID, stateTag: UUID) {
|
init(id: NSManagedObjectID, isReloaded: Bool = false) {
|
||||||
|
|
||||||
self.id = id
|
self.id = id
|
||||||
self.stateTag = stateTag
|
self.isReloaded = isReloaded
|
||||||
}
|
|
||||||
|
|
||||||
var stateID: ItemStateID {
|
|
||||||
|
|
||||||
return .init(id: self.id, stateTag: self.stateTag)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func isContentEqual(to source: Item) -> Bool {
|
func isContentEqual(to source: Item) -> Bool {
|
||||||
|
|
||||||
return self.id == source.id && self.stateTag == source.stateTag
|
return !self.isReloaded && self.id == source.id
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Identifiable
|
// MARK: Identifiable
|
||||||
@@ -618,27 +552,22 @@ extension Internals {
|
|||||||
fileprivate struct Section: Identifiable, Equatable {
|
fileprivate struct Section: Identifiable, Equatable {
|
||||||
|
|
||||||
var elements: [Item] = []
|
var elements: [Item] = []
|
||||||
var stateTag: UUID
|
var isReloaded: Bool
|
||||||
|
|
||||||
init(id: String, items: [Item] = [], stateTag: UUID) {
|
init(id: String, items: [Item] = [], isReloaded: Bool = false) {
|
||||||
self.id = id
|
self.id = id
|
||||||
self.elements = items
|
self.elements = items
|
||||||
self.stateTag = stateTag
|
self.isReloaded = isReloaded
|
||||||
}
|
}
|
||||||
|
|
||||||
init<S: Sequence>(source: Section, elements: S) where S.Element == Item {
|
init<S: Sequence>(source: Section, elements: S) where S.Element == Item {
|
||||||
|
|
||||||
self.init(id: source.id, items: Array(elements), stateTag: source.stateTag)
|
self.init(id: source.id, items: Array(elements), isReloaded: source.isReloaded)
|
||||||
}
|
|
||||||
|
|
||||||
var stateID: SectionStateID {
|
|
||||||
|
|
||||||
return .init(id: self.id, stateTag: self.stateTag)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func isContentEqual(to source: Section) -> Bool {
|
func isContentEqual(to source: Section) -> Bool {
|
||||||
|
|
||||||
return self.id == source.id && self.stateTag == source.stateTag
|
return !self.isReloaded && self.id == source.id
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Identifiable
|
// MARK: Identifiable
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ extension Internals {
|
|||||||
|
|
||||||
// #if canImport(UIKit) || canImport(AppKit)
|
// #if canImport(UIKit) || canImport(AppKit)
|
||||||
//
|
//
|
||||||
// if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *) {
|
// if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) {
|
||||||
//
|
//
|
||||||
// return
|
// return
|
||||||
// }
|
// }
|
||||||
@@ -96,7 +96,7 @@ extension Internals {
|
|||||||
|
|
||||||
// #if canImport(UIKit) || canImport(AppKit)
|
// #if canImport(UIKit) || canImport(AppKit)
|
||||||
//
|
//
|
||||||
// @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
// @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
// @objc
|
// @objc
|
||||||
// dynamic func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) {
|
// dynamic func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) {
|
||||||
//
|
//
|
||||||
@@ -111,48 +111,12 @@ extension Internals {
|
|||||||
@objc
|
@objc
|
||||||
dynamic func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
|
dynamic func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
|
||||||
|
|
||||||
let nextStateTag: UUID = .init()
|
|
||||||
var dataSourceSnapshot = Internals.DiffableDataSourceSnapshot(
|
|
||||||
sections: controller.sections ?? [],
|
|
||||||
previousStateTag: self.previousStateTag,
|
|
||||||
nextStateTag: nextStateTag
|
|
||||||
)
|
|
||||||
dataSourceSnapshot.reloadItems(self.reloadedItemIDs, nextStateTag: nextStateTag)
|
|
||||||
dataSourceSnapshot.reloadSections(self.reloadedSectionIDs, nextStateTag: nextStateTag)
|
|
||||||
|
|
||||||
self.handler?.controller(
|
self.handler?.controller(
|
||||||
controller,
|
controller,
|
||||||
didChangContentWith: dataSourceSnapshot
|
didChangContentWith: Internals.DiffableDataSourceSnapshot(
|
||||||
|
sections: controller.sections ?? []
|
||||||
|
)
|
||||||
)
|
)
|
||||||
self.previousStateTag = nextStateTag
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
|
||||||
dynamic func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
|
|
||||||
|
|
||||||
let managedObject = anObject as! NSManagedObject
|
|
||||||
self.reloadedItemIDs.insert(managedObject.objectID)
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc
|
|
||||||
dynamic func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
|
|
||||||
|
|
||||||
self.reloadedSectionIDs.insert(sectionInfo.name)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: Private
|
|
||||||
|
|
||||||
private var previousStateTag: UUID = .init() {
|
|
||||||
|
|
||||||
didSet {
|
|
||||||
|
|
||||||
self.reloadedItemIDs = []
|
|
||||||
self.reloadedSectionIDs = []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var reloadedItemIDs: Set<NSManagedObjectID> = []
|
|
||||||
private var reloadedSectionIDs: Set<String> = []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,17 +128,17 @@ public struct ListSnapshot<O: DynamicObject>: SnapshotResult, RandomAccessCollec
|
|||||||
|
|
||||||
public mutating func appendItems(_ identifiers: [ItemID], toSection sectionIdentifier: SectionID? = nil) {
|
public mutating func appendItems(_ identifiers: [ItemID], toSection sectionIdentifier: SectionID? = nil) {
|
||||||
|
|
||||||
self.diffableSnapshot.appendItems(identifiers, toSection: sectionIdentifier, nextStateTag: .init())
|
self.diffableSnapshot.appendItems(identifiers, toSection: sectionIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
public mutating func insertItems(_ identifiers: [ItemID], beforeItem beforeIdentifier: ItemID) {
|
public mutating func insertItems(_ identifiers: [ItemID], beforeItem beforeIdentifier: ItemID) {
|
||||||
|
|
||||||
self.diffableSnapshot.insertItems(identifiers, beforeItem: beforeIdentifier, nextStateTag: .init())
|
self.diffableSnapshot.insertItems(identifiers, beforeItem: beforeIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
public mutating func insertItems(_ identifiers: [ItemID], afterItem afterIdentifier: ItemID) {
|
public mutating func insertItems(_ identifiers: [ItemID], afterItem afterIdentifier: ItemID) {
|
||||||
|
|
||||||
self.diffableSnapshot.insertItems(identifiers, afterItem: afterIdentifier, nextStateTag: .init())
|
self.diffableSnapshot.insertItems(identifiers, afterItem: afterIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
public mutating func deleteItems(_ identifiers: [ItemID]) {
|
public mutating func deleteItems(_ identifiers: [ItemID]) {
|
||||||
@@ -168,17 +168,17 @@ public struct ListSnapshot<O: DynamicObject>: SnapshotResult, RandomAccessCollec
|
|||||||
|
|
||||||
public mutating func appendSections(_ identifiers: [SectionID]) {
|
public mutating func appendSections(_ identifiers: [SectionID]) {
|
||||||
|
|
||||||
self.diffableSnapshot.appendSections(identifiers, nextStateTag: .init())
|
self.diffableSnapshot.appendSections(identifiers)
|
||||||
}
|
}
|
||||||
|
|
||||||
public mutating func insertSections(_ identifiers: [SectionID], beforeSection toIdentifier: SectionID) {
|
public mutating func insertSections(_ identifiers: [SectionID], beforeSection toIdentifier: SectionID) {
|
||||||
|
|
||||||
self.diffableSnapshot.insertSections(identifiers, beforeSection: toIdentifier, nextStateTag: .init())
|
self.diffableSnapshot.insertSections(identifiers, beforeSection: toIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
public mutating func insertSections(_ identifiers: [SectionID], afterSection toIdentifier: SectionID) {
|
public mutating func insertSections(_ identifiers: [SectionID], afterSection toIdentifier: SectionID) {
|
||||||
|
|
||||||
self.diffableSnapshot.insertSections(identifiers, afterSection: toIdentifier, nextStateTag: .init())
|
self.diffableSnapshot.insertSections(identifiers, afterSection: toIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
public mutating func deleteSections(_ identifiers: [SectionID]) {
|
public mutating func deleteSections(_ identifiers: [SectionID]) {
|
||||||
@@ -263,16 +263,6 @@ public struct ListSnapshot<O: DynamicObject>: SnapshotResult, RandomAccessCollec
|
|||||||
self.diffableSnapshot = diffableSnapshot
|
self.diffableSnapshot = diffableSnapshot
|
||||||
self.context = context
|
self.context = context
|
||||||
}
|
}
|
||||||
|
|
||||||
internal var nextStateTag: UUID {
|
|
||||||
|
|
||||||
return self.diffableSnapshot.nextStateTag
|
|
||||||
}
|
|
||||||
|
|
||||||
internal func itemIDs(where stateCondition: @escaping (UUID) -> Bool) -> [ItemID] {
|
|
||||||
|
|
||||||
return self.diffableSnapshot.itemIDs(where: stateCondition)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: Private
|
// MARK: Private
|
||||||
|
|||||||
@@ -49,10 +49,7 @@ public final class LiveList<O: DynamicObject>: Hashable {
|
|||||||
|
|
||||||
willSet {
|
willSet {
|
||||||
|
|
||||||
if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *) {
|
self.willChange()
|
||||||
|
|
||||||
self.willChange()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,7 +264,7 @@ public final class LiveList<O: DynamicObject>: Hashable {
|
|||||||
applyFetchClauses: applyFetchClauses
|
applyFetchClauses: applyFetchClauses
|
||||||
)
|
)
|
||||||
|
|
||||||
if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *) {
|
if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) {
|
||||||
|
|
||||||
#if canImport(Combine)
|
#if canImport(Combine)
|
||||||
self.rawObjectWillChange = ObservableObjectPublisher()
|
self.rawObjectWillChange = ObservableObjectPublisher()
|
||||||
@@ -318,20 +315,33 @@ extension LiveList: FetchedDiffableDataSourceSnapshotHandler {
|
|||||||
#if canImport(Combine)
|
#if canImport(Combine)
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
|
extension LiveList: ObservableObject {}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// MARK: - LiveList: LiveResult
|
// MARK: - LiveList: LiveResult
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
|
||||||
extension LiveList: LiveResult {
|
extension LiveList: LiveResult {
|
||||||
|
|
||||||
// MARK: ObservableObject
|
// MARK: ObservableObject
|
||||||
|
|
||||||
|
#if canImport(Combine)
|
||||||
|
|
||||||
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
public var objectWillChange: ObservableObjectPublisher {
|
public var objectWillChange: ObservableObjectPublisher {
|
||||||
|
|
||||||
return self.rawObjectWillChange! as! ObservableObjectPublisher
|
return self.rawObjectWillChange! as! ObservableObjectPublisher
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
public func willChange() {
|
public func willChange() {
|
||||||
|
|
||||||
|
guard #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) else {
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
#if canImport(Combine)
|
#if canImport(Combine)
|
||||||
|
|
||||||
#if canImport(SwiftUI)
|
#if canImport(SwiftUI)
|
||||||
@@ -340,11 +350,10 @@ extension LiveList: LiveResult {
|
|||||||
self.objectWillChange.send()
|
self.objectWillChange.send()
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
self.objectWillChange.send()
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
self.objectWillChange.send()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,5 +362,3 @@ extension LiveList: LiveResult {
|
|||||||
// TODO:
|
// TODO:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ public final class LiveObject<O: DynamicObject>: Identifiable, Hashable {
|
|||||||
|
|
||||||
self.id = id
|
self.id = id
|
||||||
self.context = context
|
self.context = context
|
||||||
if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *) {
|
if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) {
|
||||||
|
|
||||||
#if canImport(Combine)
|
#if canImport(Combine)
|
||||||
self.rawObjectWillChange = ObservableObjectPublisher()
|
self.rawObjectWillChange = ObservableObjectPublisher()
|
||||||
@@ -132,10 +132,7 @@ public final class LiveObject<O: DynamicObject>: Identifiable, Hashable {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.$lazySnapshot.reset({ initializer(id, context) })
|
self.$lazySnapshot.reset({ initializer(id, context) })
|
||||||
if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *) {
|
self.willChange()
|
||||||
|
|
||||||
self.willChange()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -156,20 +153,33 @@ public final class LiveObject<O: DynamicObject>: Identifiable, Hashable {
|
|||||||
#if canImport(Combine)
|
#if canImport(Combine)
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
|
extension LiveObject: ObservableObject {}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// MARK: - LiveObject: LiveResult
|
// MARK: - LiveObject: LiveResult
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
|
||||||
extension LiveObject: LiveResult {
|
extension LiveObject: LiveResult {
|
||||||
|
|
||||||
// MARK: ObservableObject
|
// MARK: ObservableObject
|
||||||
|
|
||||||
|
#if canImport(Combine)
|
||||||
|
|
||||||
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
public var objectWillChange: ObservableObjectPublisher {
|
public var objectWillChange: ObservableObjectPublisher {
|
||||||
|
|
||||||
return self.rawObjectWillChange! as! ObservableObjectPublisher
|
return self.rawObjectWillChange! as! ObservableObjectPublisher
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
public func willChange() {
|
public func willChange() {
|
||||||
|
|
||||||
|
guard #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) else {
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
#if canImport(Combine)
|
#if canImport(Combine)
|
||||||
|
|
||||||
#if canImport(SwiftUI)
|
#if canImport(SwiftUI)
|
||||||
@@ -178,11 +188,10 @@ extension LiveObject: LiveResult {
|
|||||||
self.objectWillChange.send()
|
self.objectWillChange.send()
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
self.objectWillChange.send()
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
self.objectWillChange.send()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,8 +201,6 @@ extension LiveObject: LiveResult {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - LiveObject where O: NSManagedObject
|
// MARK: - LiveObject where O: NSManagedObject
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
//#warning("TODO: autoupdating doesn't work yet")
|
//#warning("TODO: autoupdating doesn't work yet")
|
||||||
//@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
//@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
//@propertyWrapper
|
//@propertyWrapper
|
||||||
//public struct LiveQuery<Result: LiveResult>: DynamicProperty {
|
//public struct LiveQuery<Result: LiveResult>: DynamicProperty {
|
||||||
//
|
//
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
//
|
//
|
||||||
//#if canImport(UIKit) || canImport(AppKit)
|
//#if canImport(UIKit) || canImport(AppKit)
|
||||||
//
|
//
|
||||||
//@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
//@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *)
|
||||||
//extension LiveQuery {
|
//extension LiveQuery {
|
||||||
//
|
//
|
||||||
// public init<D: DynamicObject>(liveList: LiveList<D>) where Result == LiveList<D> {
|
// public init<D: DynamicObject>(liveList: LiveList<D>) where Result == LiveList<D> {
|
||||||
|
|||||||
@@ -36,8 +36,7 @@ import AppKit
|
|||||||
|
|
||||||
// MARK: - LiveResult
|
// MARK: - LiveResult
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
public protocol LiveResult: AnyObject {
|
||||||
public protocol LiveResult: ObservableObject {
|
|
||||||
|
|
||||||
associatedtype ObjectType
|
associatedtype ObjectType
|
||||||
associatedtype SnapshotType: SnapshotResult where SnapshotType.ObjectType == Self.ObjectType
|
associatedtype SnapshotType: SnapshotResult where SnapshotType.ObjectType == Self.ObjectType
|
||||||
|
|||||||
9
Sources/ObjectRepresentation.swift
Normal file
9
Sources/ObjectRepresentation.swift
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
//
|
||||||
|
// ObjectRepresentation.swift
|
||||||
|
// CoreStore
|
||||||
|
//
|
||||||
|
// Created by John Estropia on 2019/10/11.
|
||||||
|
// Copyright © 2019 John Rommel Estropia. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
35
Sources/PropertyProtocol.swift
Normal file
35
Sources/PropertyProtocol.swift
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// PropertyProtocol.swift
|
||||||
|
// CoreStore
|
||||||
|
//
|
||||||
|
// Copyright © 2018 John Rommel Estropia
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: - PropertyProtocol
|
||||||
|
|
||||||
|
internal protocol PropertyProtocol: AnyObject {
|
||||||
|
|
||||||
|
var keyPath: KeyPathString { get }
|
||||||
|
}
|
||||||
@@ -249,11 +249,15 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
// MARK: RelationshipKeyPathStringConvertible
|
// MARK: RelationshipKeyPathStringConvertible
|
||||||
|
|
||||||
public typealias ReturnValueType = DestinationValueType?
|
public typealias ReturnValueType = DestinationValueType?
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: PropertyProtocol
|
||||||
|
|
||||||
|
internal let keyPath: KeyPathString
|
||||||
|
|
||||||
|
|
||||||
// MARK: RelationshipProtocol
|
// MARK: RelationshipProtocol
|
||||||
|
|
||||||
internal let keyPath: KeyPathString
|
|
||||||
internal let isToMany = false
|
internal let isToMany = false
|
||||||
internal let isOrdered = false
|
internal let isOrdered = false
|
||||||
internal let deleteRule: NSDeleteRule
|
internal let deleteRule: NSDeleteRule
|
||||||
@@ -540,11 +544,15 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
// MARK: RelationshipKeyPathStringConvertible
|
// MARK: RelationshipKeyPathStringConvertible
|
||||||
|
|
||||||
public typealias ReturnValueType = [DestinationValueType]
|
public typealias ReturnValueType = [DestinationValueType]
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: PropertyProtocol
|
||||||
|
|
||||||
|
internal let keyPath: KeyPathString
|
||||||
|
|
||||||
|
|
||||||
// MARK: RelationshipProtocol
|
// MARK: RelationshipProtocol
|
||||||
|
|
||||||
internal let keyPath: KeyPathString
|
|
||||||
internal let isToMany = true
|
internal let isToMany = true
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
internal let isOrdered = true
|
internal let isOrdered = true
|
||||||
@@ -837,11 +845,15 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
// MARK: RelationshipKeyPathStringConvertible
|
// MARK: RelationshipKeyPathStringConvertible
|
||||||
|
|
||||||
public typealias ReturnValueType = Set<DestinationValueType>
|
public typealias ReturnValueType = Set<DestinationValueType>
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: PropertyProtocol
|
||||||
|
|
||||||
|
internal let keyPath: KeyPathString
|
||||||
|
|
||||||
|
|
||||||
// MARK: RelationshipProtocol
|
// MARK: RelationshipProtocol
|
||||||
|
|
||||||
internal let keyPath: KeyPathString
|
|
||||||
internal let isToMany = true
|
internal let isToMany = true
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
internal let isOrdered = false
|
internal let isOrdered = false
|
||||||
|
|||||||
@@ -29,9 +29,8 @@ import CoreData
|
|||||||
|
|
||||||
// MARK: - RelationshipProtocol
|
// MARK: - RelationshipProtocol
|
||||||
|
|
||||||
internal protocol RelationshipProtocol: AnyObject {
|
internal protocol RelationshipProtocol: PropertyProtocol {
|
||||||
|
|
||||||
var keyPath: KeyPathString { get }
|
|
||||||
var isToMany: Bool { get }
|
var isToMany: Bool { get }
|
||||||
var isOrdered: Bool { get }
|
var isOrdered: Bool { get }
|
||||||
var deleteRule: NSDeleteRule { get }
|
var deleteRule: NSDeleteRule { get }
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ import AppKit
|
|||||||
|
|
||||||
// MARK: - SnapshotResult
|
// MARK: - SnapshotResult
|
||||||
|
|
||||||
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 15.0, *)
|
|
||||||
public protocol SnapshotResult {
|
public protocol SnapshotResult {
|
||||||
|
|
||||||
associatedtype ObjectType: DynamicObject
|
associatedtype ObjectType: DynamicObject
|
||||||
|
|||||||
@@ -209,6 +209,11 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
public typealias ReturnValueType = DestinationValueType
|
public typealias ReturnValueType = DestinationValueType
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: PropertyProtocol
|
||||||
|
|
||||||
|
internal let keyPath: KeyPathString
|
||||||
|
|
||||||
|
|
||||||
// MARK: AttributeProtocol
|
// MARK: AttributeProtocol
|
||||||
|
|
||||||
internal static var attributeType: NSAttributeType {
|
internal static var attributeType: NSAttributeType {
|
||||||
@@ -216,7 +221,6 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
return .transformableAttributeType
|
return .transformableAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
internal let keyPath: KeyPathString
|
|
||||||
internal let isOptional = false
|
internal let isOptional = false
|
||||||
internal let isTransient: Bool
|
internal let isTransient: Bool
|
||||||
internal let allowsExternalBinaryDataStorage: Bool
|
internal let allowsExternalBinaryDataStorage: Bool
|
||||||
@@ -427,6 +431,11 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
public typealias ReturnValueType = DestinationValueType?
|
public typealias ReturnValueType = DestinationValueType?
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: PropertyProtocol
|
||||||
|
|
||||||
|
internal let keyPath: KeyPathString
|
||||||
|
|
||||||
|
|
||||||
// MARK: AttributeProtocol
|
// MARK: AttributeProtocol
|
||||||
|
|
||||||
internal static var attributeType: NSAttributeType {
|
internal static var attributeType: NSAttributeType {
|
||||||
@@ -434,7 +443,6 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
return .transformableAttributeType
|
return .transformableAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
internal let keyPath: KeyPathString
|
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
internal let isTransient: Bool
|
internal let isTransient: Bool
|
||||||
internal let allowsExternalBinaryDataStorage: Bool
|
internal let allowsExternalBinaryDataStorage: Bool
|
||||||
|
|||||||
@@ -202,6 +202,11 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
// MARK: AttributeKeyPathStringConvertible
|
// MARK: AttributeKeyPathStringConvertible
|
||||||
|
|
||||||
public typealias ReturnValueType = DestinationValueType
|
public typealias ReturnValueType = DestinationValueType
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: PropertyProtocol
|
||||||
|
|
||||||
|
internal let keyPath: KeyPathString
|
||||||
|
|
||||||
|
|
||||||
// MARK: AttributeProtocol
|
// MARK: AttributeProtocol
|
||||||
@@ -210,8 +215,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
return V.cs_rawAttributeType
|
return V.cs_rawAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
internal let keyPath: KeyPathString
|
|
||||||
internal let isOptional = false
|
internal let isOptional = false
|
||||||
internal let isTransient: Bool
|
internal let isTransient: Bool
|
||||||
internal let allowsExternalBinaryDataStorage = false
|
internal let allowsExternalBinaryDataStorage = false
|
||||||
@@ -420,6 +424,11 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
// MARK: AttributeKeyPathStringConvertible
|
// MARK: AttributeKeyPathStringConvertible
|
||||||
|
|
||||||
public typealias ReturnValueType = DestinationValueType?
|
public typealias ReturnValueType = DestinationValueType?
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: PropertyProtocol
|
||||||
|
|
||||||
|
internal let keyPath: KeyPathString
|
||||||
|
|
||||||
|
|
||||||
// MARK: AttributeProtocol
|
// MARK: AttributeProtocol
|
||||||
@@ -429,7 +438,6 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
return V.cs_rawAttributeType
|
return V.cs_rawAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
internal let keyPath: KeyPathString
|
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
internal let isTransient: Bool
|
internal let isTransient: Bool
|
||||||
internal let allowsExternalBinaryDataStorage = false
|
internal let allowsExternalBinaryDataStorage = false
|
||||||
|
|||||||
Reference in New Issue
Block a user