WIP: broken generics

This commit is contained in:
John Estropia
2016-09-06 20:16:46 +09:00
parent b502895d63
commit 82de482191
95 changed files with 610 additions and 677 deletions
+16 -36
View File
@@ -340,16 +340,12 @@
B56321B41BD6521C006C9394 /* NSManagedObjectContext+Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E84F331AFF85470064E85B /* NSManagedObjectContext+Transaction.swift */; }; B56321B41BD6521C006C9394 /* NSManagedObjectContext+Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E84F331AFF85470064E85B /* NSManagedObjectContext+Transaction.swift */; };
B56321B51BD6521C006C9394 /* NSManagedObjectModel+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51BE0691B47FC4B0069F532 /* NSManagedObjectModel+Setup.swift */; }; B56321B51BD6521C006C9394 /* NSManagedObjectModel+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51BE0691B47FC4B0069F532 /* NSManagedObjectModel+Setup.swift */; };
B56321B61BD6521C006C9394 /* WeakObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E84F2D1AFF849C0064E85B /* WeakObject.swift */; }; B56321B61BD6521C006C9394 /* WeakObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E84F2D1AFF849C0064E85B /* WeakObject.swift */; };
B56507901D393087000596DA /* GCDKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B565078F1D393087000596DA /* GCDKit.framework */; };
B56507921D3930B5000596DA /* GCDKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507911D3930B5000596DA /* GCDKit.framework */; };
B56507941D3930BC000596DA /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507931D3930BC000596DA /* CoreData.framework */; }; B56507941D3930BC000596DA /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507931D3930BC000596DA /* CoreData.framework */; };
B56507961D3930C1000596DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507951D3930C1000596DA /* Foundation.framework */; }; B56507961D3930C1000596DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507951D3930C1000596DA /* Foundation.framework */; };
B56507981D3930CC000596DA /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507971D3930CC000596DA /* CoreData.framework */; }; B56507981D3930CC000596DA /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507971D3930CC000596DA /* CoreData.framework */; };
B565079A1D3930D1000596DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507991D3930D1000596DA /* Foundation.framework */; }; B565079A1D3930D1000596DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507991D3930D1000596DA /* Foundation.framework */; };
B565079C1D3930D8000596DA /* GCDKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B565079B1D3930D8000596DA /* GCDKit.framework */; };
B565079E1D3930ED000596DA /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B565079D1D3930ED000596DA /* CoreData.framework */; }; B565079E1D3930ED000596DA /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B565079D1D3930ED000596DA /* CoreData.framework */; };
B56507A01D3930F5000596DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B565079F1D3930F5000596DA /* Foundation.framework */; }; B56507A01D3930F5000596DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B565079F1D3930F5000596DA /* Foundation.framework */; };
B56507A21D393101000596DA /* GCDKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B56507A11D393101000596DA /* GCDKit.framework */; };
B5677D3D1CD3B1E400322BFC /* ICloudStoreObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5677D3C1CD3B1E400322BFC /* ICloudStoreObserver.swift */; }; B5677D3D1CD3B1E400322BFC /* ICloudStoreObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5677D3C1CD3B1E400322BFC /* ICloudStoreObserver.swift */; };
B5677D3F1CD3B1E400322BFC /* ICloudStoreObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5677D3C1CD3B1E400322BFC /* ICloudStoreObserver.swift */; }; B5677D3F1CD3B1E400322BFC /* ICloudStoreObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5677D3C1CD3B1E400322BFC /* ICloudStoreObserver.swift */; };
B5677D401CD3B1E400322BFC /* ICloudStoreObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5677D3C1CD3B1E400322BFC /* ICloudStoreObserver.swift */; }; B5677D401CD3B1E400322BFC /* ICloudStoreObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5677D3C1CD3B1E400322BFC /* ICloudStoreObserver.swift */; };
@@ -589,7 +585,6 @@
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>"; };
B519E4571C4CD2CA00E7B469 /* GCDKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GCDKit.framework; path = "../../Library/Developer/Xcode/DerivedData/Build/Products/Debug-iphoneos/GCDKit.framework"; sourceTree = "<group>"; };
B51BE0691B47FC4B0069F532 /* NSManagedObjectModel+Setup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSManagedObjectModel+Setup.swift"; sourceTree = "<group>"; }; B51BE0691B47FC4B0069F532 /* NSManagedObjectModel+Setup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSManagedObjectModel+Setup.swift"; sourceTree = "<group>"; };
B51FE5AA1CD4D00300E54258 /* CoreStore+CustomDebugStringConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CoreStore+CustomDebugStringConvertible.swift"; sourceTree = "<group>"; }; B51FE5AA1CD4D00300E54258 /* CoreStore+CustomDebugStringConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CoreStore+CustomDebugStringConvertible.swift"; sourceTree = "<group>"; };
B5202CF91C04688100DED140 /* NSFetchedResultsController+Convenience.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSFetchedResultsController+Convenience.swift"; sourceTree = "<group>"; }; B5202CF91C04688100DED140 /* NSFetchedResultsController+Convenience.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSFetchedResultsController+Convenience.swift"; sourceTree = "<group>"; };
@@ -641,16 +636,12 @@
B563216F1BD65082006C9394 /* CoreStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CoreStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B563216F1BD65082006C9394 /* CoreStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CoreStore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
B56321791BD650DE006C9394 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS2.0.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; }; B56321791BD650DE006C9394 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS2.0.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; };
B563217B1BD650E3006C9394 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS2.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; B563217B1BD650E3006C9394 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS2.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
B565078F1D393087000596DA /* GCDKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GCDKit.framework; path = "../../../Library/Developer/Xcode/DerivedData/Build/Products/Debug-iphonesimulator/GCDKit.framework"; sourceTree = "<group>"; };
B56507911D3930B5000596DA /* GCDKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GCDKit.framework; path = "Carthage/Checkouts/GCDKit/build/Debug-appletvos/GCDKit.framework"; sourceTree = "<group>"; };
B56507931D3930BC000596DA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.0.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; }; B56507931D3930BC000596DA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.0.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; };
B56507951D3930C1000596DA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; B56507951D3930C1000596DA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
B56507971D3930CC000596DA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS3.0.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; }; B56507971D3930CC000596DA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS3.0.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; };
B56507991D3930D1000596DA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS3.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; B56507991D3930D1000596DA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS3.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
B565079B1D3930D8000596DA /* GCDKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GCDKit.framework; path = "Carthage/Checkouts/GCDKit/build/Debug-watchos/GCDKit.framework"; sourceTree = "<group>"; };
B565079D1D3930ED000596DA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; }; B565079D1D3930ED000596DA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; };
B565079F1D3930F5000596DA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; B565079F1D3930F5000596DA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
B56507A11D393101000596DA /* GCDKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GCDKit.framework; path = Carthage/Checkouts/GCDKit/build/Debug/GCDKit.framework; sourceTree = "<group>"; };
B5677D3C1CD3B1E400322BFC /* ICloudStoreObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ICloudStoreObserver.swift; sourceTree = "<group>"; }; B5677D3C1CD3B1E400322BFC /* ICloudStoreObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ICloudStoreObserver.swift; sourceTree = "<group>"; };
B56964D31B22FFAD0075EE4A /* DataStack+Migration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "DataStack+Migration.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; B56964D31B22FFAD0075EE4A /* DataStack+Migration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "DataStack+Migration.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
B56965231B356B820075EE4A /* MigrationResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationResult.swift; sourceTree = "<group>"; }; B56965231B356B820075EE4A /* MigrationResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationResult.swift; sourceTree = "<group>"; };
@@ -753,7 +744,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
B56507901D393087000596DA /* GCDKit.framework in Frameworks */,
B5D39A0219FD00C9000E91BB /* Foundation.framework in Frameworks */, B5D39A0219FD00C9000E91BB /* Foundation.framework in Frameworks */,
2F03A54D19C5C872005002A5 /* CoreData.framework in Frameworks */, 2F03A54D19C5C872005002A5 /* CoreData.framework in Frameworks */,
); );
@@ -773,7 +763,6 @@
files = ( files = (
B56507961D3930C1000596DA /* Foundation.framework in Frameworks */, B56507961D3930C1000596DA /* Foundation.framework in Frameworks */,
B56507941D3930BC000596DA /* CoreData.framework in Frameworks */, B56507941D3930BC000596DA /* CoreData.framework in Frameworks */,
B56507921D3930B5000596DA /* GCDKit.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -789,7 +778,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
B56507A21D393101000596DA /* GCDKit.framework in Frameworks */,
B56507A01D3930F5000596DA /* Foundation.framework in Frameworks */, B56507A01D3930F5000596DA /* Foundation.framework in Frameworks */,
B565079E1D3930ED000596DA /* CoreData.framework in Frameworks */, B565079E1D3930ED000596DA /* CoreData.framework in Frameworks */,
); );
@@ -807,7 +795,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
B565079C1D3930D8000596DA /* GCDKit.framework in Frameworks */,
B565079A1D3930D1000596DA /* Foundation.framework in Frameworks */, B565079A1D3930D1000596DA /* Foundation.framework in Frameworks */,
B56507981D3930CC000596DA /* CoreData.framework in Frameworks */, B56507981D3930CC000596DA /* CoreData.framework in Frameworks */,
); );
@@ -908,17 +895,12 @@
2F291E3119C6D4D3007AF63F /* Frameworks */ = { 2F291E3119C6D4D3007AF63F /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B56507A11D393101000596DA /* GCDKit.framework */,
B565079F1D3930F5000596DA /* Foundation.framework */, B565079F1D3930F5000596DA /* Foundation.framework */,
B565079D1D3930ED000596DA /* CoreData.framework */, B565079D1D3930ED000596DA /* CoreData.framework */,
B565079B1D3930D8000596DA /* GCDKit.framework */,
B56507991D3930D1000596DA /* Foundation.framework */, B56507991D3930D1000596DA /* Foundation.framework */,
B56507971D3930CC000596DA /* CoreData.framework */, B56507971D3930CC000596DA /* CoreData.framework */,
B56507951D3930C1000596DA /* Foundation.framework */, B56507951D3930C1000596DA /* Foundation.framework */,
B56507931D3930BC000596DA /* CoreData.framework */, B56507931D3930BC000596DA /* CoreData.framework */,
B56507911D3930B5000596DA /* GCDKit.framework */,
B565078F1D393087000596DA /* GCDKit.framework */,
B519E4571C4CD2CA00E7B469 /* GCDKit.framework */,
B5548CD71BD65AE50077652A /* CoreData.framework */, B5548CD71BD65AE50077652A /* CoreData.framework */,
B56321791BD650DE006C9394 /* CoreData.framework */, B56321791BD650DE006C9394 /* CoreData.framework */,
82BA18E01C4BBE2C00A0916E /* CoreData.framework */, 82BA18E01C4BBE2C00A0916E /* CoreData.framework */,
@@ -2131,8 +2113,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -2188,8 +2172,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -2229,6 +2215,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
@@ -2246,6 +2233,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
@@ -2295,6 +2283,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
@@ -2314,6 +2303,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
@@ -2364,17 +2354,14 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "";
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = "$(inherited)";
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Checkouts/GCDKit/build/Debug",
);
FRAMEWORK_VERSION = A; FRAMEWORK_VERSION = A;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -2389,7 +2376,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "";
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
@@ -2397,10 +2384,7 @@
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = "$(inherited)";
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Checkouts/GCDKit/build/Debug",
);
FRAMEWORK_VERSION = A; FRAMEWORK_VERSION = A;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -2450,15 +2434,13 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = "$(inherited)";
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Checkouts/GCDKit/build/Debug-watchos",
);
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -2473,16 +2455,14 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = "$(inherited)";
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Checkouts/GCDKit/build/Debug-watchos",
);
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
-3
View File
@@ -7,7 +7,4 @@
<FileRef <FileRef
location = "group:CoreStoreDemo/CoreStoreDemo.xcodeproj"> location = "group:CoreStoreDemo/CoreStoreDemo.xcodeproj">
</FileRef> </FileRef>
<FileRef
location = "group:Carthage/Checkouts/GCDKit/GCDKit.xcodeproj">
</FileRef>
</Workspace> </Workspace>
@@ -36,8 +36,6 @@
B569651C1B30889A0075EE4A /* QueryingResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */; }; B569651C1B30889A0075EE4A /* QueryingResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */; };
B56965291B3582D30075EE4A /* MigrationDemo.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = B56965271B3582D30075EE4A /* MigrationDemo.xcdatamodeld */; }; B56965291B3582D30075EE4A /* MigrationDemo.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = B56965271B3582D30075EE4A /* MigrationDemo.xcdatamodeld */; };
B5E599321B5240F50084BD5F /* OrganismTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E599311B5240F50084BD5F /* OrganismTableViewCell.swift */; }; B5E599321B5240F50084BD5F /* OrganismTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E599311B5240F50084BD5F /* OrganismTableViewCell.swift */; };
B5E89ACD1C52929C003B04A9 /* GCDKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9241C202429008147CD /* GCDKit.framework */; };
B5E89ACE1C52929C003B04A9 /* GCDKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9241C202429008147CD /* GCDKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
B5E89AD01C5292A2003B04A9 /* CoreStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9211C202429008147CD /* CoreStore.framework */; }; B5E89AD01C5292A2003B04A9 /* CoreStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9211C202429008147CD /* CoreStore.framework */; };
B5E89AD11C5292A2003B04A9 /* CoreStore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9211C202429008147CD /* CoreStore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; B5E89AD11C5292A2003B04A9 /* CoreStore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9211C202429008147CD /* CoreStore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
B5EE25851B36E23C0000406B /* OrganismV1.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5EE25841B36E23C0000406B /* OrganismV1.swift */; }; B5EE25851B36E23C0000406B /* OrganismV1.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5EE25841B36E23C0000406B /* OrganismV1.swift */; };
@@ -54,7 +52,6 @@
dstPath = ""; dstPath = "";
dstSubfolderSpec = 10; dstSubfolderSpec = 10;
files = ( files = (
B5E89ACE1C52929C003B04A9 /* GCDKit.framework in Embed Frameworks */,
B5E89AD11C5292A2003B04A9 /* CoreStore.framework in Embed Frameworks */, B5E89AD11C5292A2003B04A9 /* CoreStore.framework in Embed Frameworks */,
); );
name = "Embed Frameworks"; name = "Embed Frameworks";
@@ -94,7 +91,6 @@
B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryingResultsViewController.swift; sourceTree = "<group>"; }; B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryingResultsViewController.swift; sourceTree = "<group>"; };
B56965281B3582D30075EE4A /* MigrationDemo.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemo.xcdatamodel; sourceTree = "<group>"; }; B56965281B3582D30075EE4A /* MigrationDemo.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemo.xcdatamodel; sourceTree = "<group>"; };
B5BDC9211C202429008147CD /* CoreStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CoreStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B5BDC9211C202429008147CD /* CoreStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CoreStore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
B5BDC9241C202429008147CD /* GCDKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GCDKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
B5E599311B5240F50084BD5F /* OrganismTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OrganismTableViewCell.swift; path = "CoreStoreDemo/MIgrations Demo/OrganismTableViewCell.swift"; sourceTree = SOURCE_ROOT; }; B5E599311B5240F50084BD5F /* OrganismTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OrganismTableViewCell.swift; path = "CoreStoreDemo/MIgrations Demo/OrganismTableViewCell.swift"; sourceTree = SOURCE_ROOT; };
B5EE25801B36E1B00000406B /* MigrationDemoV2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemoV2.xcdatamodel; sourceTree = "<group>"; }; B5EE25801B36E1B00000406B /* MigrationDemoV2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemoV2.xcdatamodel; sourceTree = "<group>"; };
B5EE25841B36E23C0000406B /* OrganismV1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrganismV1.swift; sourceTree = "<group>"; }; B5EE25841B36E23C0000406B /* OrganismV1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrganismV1.swift; sourceTree = "<group>"; };
@@ -110,7 +106,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
B5E89ACD1C52929C003B04A9 /* GCDKit.framework in Frameworks */,
B5E89AD01C5292A2003B04A9 /* CoreStore.framework in Frameworks */, B5E89AD01C5292A2003B04A9 /* CoreStore.framework in Frameworks */,
B52977E11B120F8A003D50A5 /* CoreLocation.framework in Frameworks */, B52977E11B120F8A003D50A5 /* CoreLocation.framework in Frameworks */,
B52977DF1B120F83003D50A5 /* MapKit.framework in Frameworks */, B52977DF1B120F83003D50A5 /* MapKit.framework in Frameworks */,
@@ -146,7 +141,6 @@
children = ( children = (
B52977E01B120F8A003D50A5 /* CoreLocation.framework */, B52977E01B120F8A003D50A5 /* CoreLocation.framework */,
B5BDC9211C202429008147CD /* CoreStore.framework */, B5BDC9211C202429008147CD /* CoreStore.framework */,
B5BDC9241C202429008147CD /* GCDKit.framework */,
B52977DE1B120F83003D50A5 /* MapKit.framework */, B52977DE1B120F83003D50A5 /* MapKit.framework */,
); );
name = Frameworks; name = Frameworks;
@@ -271,7 +271,7 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo
return Static.timeZonesStack.queryAttributes( return Static.timeZonesStack.queryAttributes(
From<TimeZone>(), From<TimeZone>(),
Select<NSDictionary>( Select<NSDictionary>(
.count("hasDaylightSavingTime", As: "numberOfCountries"), .count("hasDaylightSavingTime", as: "numberOfCountries"),
"hasDaylightSavingTime" "hasDaylightSavingTime"
), ),
GroupBy("hasDaylightSavingTime"), GroupBy("hasDaylightSavingTime"),
@@ -8,7 +8,6 @@
import UIKit import UIKit
import CoreStore import CoreStore
import GCDKit
// MARK: - CustomLoggerViewController // MARK: - CustomLoggerViewController
@@ -11,7 +11,6 @@ import CoreLocation
import MapKit import MapKit
import AddressBookUI import AddressBookUI
import CoreStore import CoreStore
import GCDKit
private struct Static { private struct Static {
+9 -9
View File
@@ -37,11 +37,11 @@ class BaseTestCase: XCTestCase {
@nonobjc @nonobjc
@discardableResult @discardableResult
func prepareStack<T>(configurations: [String?] = [nil], _ closure: @noescape (dataStack: DataStack) -> T) -> T { func prepareStack<T>(configurations: [String?] = [nil], _ closure: (_ dataStack: DataStack) -> T) -> T {
let stack = DataStack( let stack = DataStack(
modelName: "Model", modelName: "Model",
bundle: Bundle(for: self.dynamicType) bundle: Bundle(for: type(of: self))
) )
do { do {
@@ -49,9 +49,9 @@ class BaseTestCase: XCTestCase {
try stack.addStorageAndWait( try stack.addStorageAndWait(
SQLiteStore( SQLiteStore(
fileURL: try SQLiteStore.defaultRootDirectory fileURL: SQLiteStore.defaultRootDirectory
.appendingPathComponent(UUID().uuidString) .appendingPathComponent(UUID().uuidString)
.appendingPathComponent("\(self.dynamicType)_\(($0 ?? "-null-")).sqlite"), .appendingPathComponent("\(type(of: self))_\(($0 ?? "-null-")).sqlite"),
configuration: $0, configuration: $0,
localStorageOptions: .recreateStoreOnModelMismatch localStorageOptions: .recreateStoreOnModelMismatch
) )
@@ -62,11 +62,11 @@ class BaseTestCase: XCTestCase {
XCTFail(error.coreStoreDumpString) XCTFail(error.coreStoreDumpString)
} }
return closure(dataStack: stack) return closure(stack)
} }
@nonobjc @nonobjc
func expectLogger<T>(_ expectations: [TestLogger.Expectation], closure: @noescape () -> T) -> T { func expectLogger<T>(_ expectations: [TestLogger.Expectation], closure: () -> T) -> T {
CoreStore.logger = TestLogger(self.prepareLoggerExpectations(expectations)) CoreStore.logger = TestLogger(self.prepareLoggerExpectations(expectations))
defer { defer {
@@ -89,7 +89,7 @@ class BaseTestCase: XCTestCase {
var testExpectations: [TestLogger.Expectation: XCTestExpectation] = [:] var testExpectations: [TestLogger.Expectation: XCTestExpectation] = [:]
for expectation in expectations { for expectation in expectations {
testExpectations[expectation] = self.expectation(withDescription: "Logger Expectation: \(expectation)") testExpectations[expectation] = self.expectation(description: "Logger Expectation: \(expectation)")
} }
return testExpectations return testExpectations
} }
@@ -97,13 +97,13 @@ class BaseTestCase: XCTestCase {
@nonobjc @nonobjc
func checkExpectationsImmediately() { func checkExpectationsImmediately() {
self.waitForExpectations(withTimeout: 0, handler: nil) self.waitForExpectations(timeout: 0, handler: nil)
} }
@nonobjc @nonobjc
func waitAndCheckExpectations() { func waitAndCheckExpectations() {
self.waitForExpectations(withTimeout: 10, handler: nil) self.waitForExpectations(timeout: 10, handler: nil)
} }
// MARK: XCTestCase // MARK: XCTestCase
@@ -20,8 +20,8 @@ class BaseTestDataTestCase: BaseTestCase {
let dateFormatter: DateFormatter = { let dateFormatter: DateFormatter = {
let formatter = DateFormatter() let formatter = DateFormatter()
formatter.locale = Locale(localeIdentifier: "en_US_POSIX") formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(name: "UTC") formatter.timeZone = TimeZone(identifier: "UTC")
formatter.calendar = Calendar(identifier: Calendar.Identifier.gregorian) formatter.calendar = Calendar(identifier: Calendar.Identifier.gregorian)
formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZ" formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"
return formatter return formatter
@@ -42,9 +42,9 @@ class BaseTestDataTestCase: BaseTestCase {
let object = transaction.create(Into<TestEntity1>(configuration)) let object = transaction.create(Into<TestEntity1>(configuration))
object.testEntityID = NSNumber(value: (configurationOrdinal * 100) + idIndex) object.testEntityID = NSNumber(value: (configurationOrdinal * 100) + idIndex)
object.testNumber = idIndex object.testNumber = NSNumber(value: idIndex)
object.testDate = self.dateFormatter.date(from: "2000-\(configurationOrdinal)-\(idIndex)T00:00:00Z") object.testDate = self.dateFormatter.date(from: "2000-\(configurationOrdinal)-\(idIndex)T00:00:00Z")
object.testBoolean = (idIndex % 2) == 1 object.testBoolean = NSNumber(value: (idIndex % 2) == 1)
object.testDecimal = NSDecimalNumber(string: "\(idIndex)") object.testDecimal = NSDecimalNumber(string: "\(idIndex)")
let string = "\(configuration ?? "nil"):TestEntity1:\(idIndex)" let string = "\(configuration ?? "nil"):TestEntity1:\(idIndex)"
@@ -59,9 +59,9 @@ class BaseTestDataTestCase: BaseTestCase {
let object = transaction.create(Into<TestEntity2>(configuration)) let object = transaction.create(Into<TestEntity2>(configuration))
object.testEntityID = NSNumber(value: (configurationOrdinal * 200) + idIndex) object.testEntityID = NSNumber(value: (configurationOrdinal * 200) + idIndex)
object.testNumber = idIndex object.testNumber = NSNumber(value: idIndex)
object.testDate = self.dateFormatter.date(from: "2000-\(configurationOrdinal)-\(idIndex)T00:00:00Z") object.testDate = self.dateFormatter.date(from: "2000-\(configurationOrdinal)-\(idIndex)T00:00:00Z")
object.testBoolean = (idIndex % 2) == 1 object.testBoolean = NSNumber(value: (idIndex % 2) == 1)
object.testDecimal = NSDecimalNumber(string: "\(idIndex)") object.testDecimal = NSDecimalNumber(string: "\(idIndex)")
let string = "\(configuration ?? "nil"):TestEntity2:\(idIndex)" let string = "\(configuration ?? "nil"):TestEntity2:\(idIndex)"
@@ -70,7 +70,7 @@ class BaseTestDataTestCase: BaseTestCase {
} }
} }
} }
transaction.commitAndWait() _ = transaction.commitAndWait()
} }
} }
} }
+11 -11
View File
@@ -46,13 +46,13 @@ final class ErrorTests: XCTestCase {
XCTAssertEqual(error, objcError.bridgeToSwift) XCTAssertEqual(error, objcError.bridgeToSwift)
XCTAssertEqual(objcError.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError.code, CoreStoreErrorCode.unknownError.rawValue) XCTAssertEqual(objcError.code, CoreStoreErrorCode.unknownError.rawValue)
XCTAssertEqual(objcError.userInfo, userInfo) XCTAssertEqual(objcError.userInfo as NSDictionary, userInfo)
let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC
XCTAssertEqual(error, objcError2.bridgeToSwift) XCTAssertEqual(error, objcError2.bridgeToSwift)
XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError2.code, CoreStoreErrorCode.unknownError.rawValue) XCTAssertEqual(objcError2.code, CoreStoreErrorCode.unknownError.rawValue)
XCTAssertEqual(objcError2.userInfo, userInfo) XCTAssertEqual(objcError2.userInfo as NSDictionary, userInfo)
} }
@objc @objc
@@ -71,13 +71,13 @@ final class ErrorTests: XCTestCase {
XCTAssertEqual(error, objcError.bridgeToSwift) XCTAssertEqual(error, objcError.bridgeToSwift)
XCTAssertEqual(objcError.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError.code, CoreStoreErrorCode.differentStorageExistsAtURL.rawValue) XCTAssertEqual(objcError.code, CoreStoreErrorCode.differentStorageExistsAtURL.rawValue)
XCTAssertEqual(objcError.userInfo, userInfo) XCTAssertEqual(objcError.userInfo as NSDictionary, userInfo)
let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC
XCTAssertEqual(error, objcError2.bridgeToSwift) XCTAssertEqual(error, objcError2.bridgeToSwift)
XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError2.code, CoreStoreErrorCode.differentStorageExistsAtURL.rawValue) XCTAssertEqual(objcError2.code, CoreStoreErrorCode.differentStorageExistsAtURL.rawValue)
XCTAssertEqual(objcError2.userInfo, userInfo) XCTAssertEqual(objcError2.userInfo as NSDictionary, userInfo)
} }
@objc @objc
@@ -85,7 +85,7 @@ final class ErrorTests: XCTestCase {
let dummyURL = URL(string: "file:///test1/test2.sqlite")! let dummyURL = URL(string: "file:///test1/test2.sqlite")!
let model = NSManagedObjectModel.fromBundle(Bundle(for: self.dynamicType), modelName: "Model") let model = NSManagedObjectModel.fromBundle(Bundle(for: type(of: self)), modelName: "Model")
let version = "1.0.0" let version = "1.0.0"
let error = CoreStoreError.mappingModelNotFound(localStoreURL: dummyURL, targetModel: model, targetModelVersion: version) let error = CoreStoreError.mappingModelNotFound(localStoreURL: dummyURL, targetModel: model, targetModelVersion: version)
@@ -101,13 +101,13 @@ final class ErrorTests: XCTestCase {
XCTAssertEqual(error, objcError.bridgeToSwift) XCTAssertEqual(error, objcError.bridgeToSwift)
XCTAssertEqual(objcError.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError.code, CoreStoreErrorCode.mappingModelNotFound.rawValue) XCTAssertEqual(objcError.code, CoreStoreErrorCode.mappingModelNotFound.rawValue)
XCTAssertEqual(objcError.userInfo, userInfo) XCTAssertEqual(objcError.userInfo as NSDictionary, userInfo)
let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC
XCTAssertEqual(error, objcError2.bridgeToSwift) XCTAssertEqual(error, objcError2.bridgeToSwift)
XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError2.code, CoreStoreErrorCode.mappingModelNotFound.rawValue) XCTAssertEqual(objcError2.code, CoreStoreErrorCode.mappingModelNotFound.rawValue)
XCTAssertEqual(objcError2.userInfo, userInfo) XCTAssertEqual(objcError2.userInfo as NSDictionary, userInfo)
} }
@objc @objc
@@ -126,13 +126,13 @@ final class ErrorTests: XCTestCase {
XCTAssertEqual(error, objcError.bridgeToSwift) XCTAssertEqual(error, objcError.bridgeToSwift)
XCTAssertEqual(objcError.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError.code, CoreStoreErrorCode.progressiveMigrationRequired.rawValue) XCTAssertEqual(objcError.code, CoreStoreErrorCode.progressiveMigrationRequired.rawValue)
XCTAssertEqual(objcError.userInfo, userInfo) XCTAssertEqual(objcError.userInfo as NSDictionary, userInfo)
let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC
XCTAssertEqual(error, objcError2.bridgeToSwift) XCTAssertEqual(error, objcError2.bridgeToSwift)
XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError2.code, CoreStoreErrorCode.progressiveMigrationRequired.rawValue) XCTAssertEqual(objcError2.code, CoreStoreErrorCode.progressiveMigrationRequired.rawValue)
XCTAssertEqual(objcError2.userInfo, userInfo) XCTAssertEqual(objcError2.userInfo as NSDictionary, userInfo)
} }
@objc @objc
@@ -158,12 +158,12 @@ final class ErrorTests: XCTestCase {
XCTAssertEqual(error, objcError.bridgeToSwift) XCTAssertEqual(error, objcError.bridgeToSwift)
XCTAssertEqual(objcError.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError.code, CoreStoreErrorCode.internalError.rawValue) XCTAssertEqual(objcError.code, CoreStoreErrorCode.internalError.rawValue)
XCTAssertEqual(objcError.userInfo, userInfo) XCTAssertEqual(objcError.userInfo as NSDictionary, userInfo)
let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC let objcError2 = objcError.bridgeToSwift.bridgeToObjectiveC
XCTAssertEqual(error, objcError2.bridgeToSwift) XCTAssertEqual(error, objcError2.bridgeToSwift)
XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain) XCTAssertEqual(objcError2.domain, CoreStoreErrorDomain)
XCTAssertEqual(objcError2.code, CoreStoreErrorCode.internalError.rawValue) XCTAssertEqual(objcError2.code, CoreStoreErrorCode.internalError.rawValue)
XCTAssertEqual(objcError2.userInfo, userInfo) XCTAssertEqual(objcError2.userInfo as NSDictionary, userInfo)
} }
} }
+4 -4
View File
@@ -69,7 +69,7 @@ final class FetchTests: BaseTestDataTestCase {
} }
do { do {
let fetchExpectation = self.expectation(withDescription: "fetch") let fetchExpectation = self.expectation(description: "fetch")
var existing1: TestEntity1? var existing1: TestEntity1?
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
@@ -88,7 +88,7 @@ final class FetchTests: BaseTestDataTestCase {
} }
do { do {
let fetchExpectation = self.expectation(withDescription: "fetch") let fetchExpectation = self.expectation(description: "fetch")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
let existing1 = transaction.fetchExisting(object) let existing1 = transaction.fetchExisting(object)
@@ -162,7 +162,7 @@ final class FetchTests: BaseTestDataTestCase {
} }
do { do {
let fetchExpectation = self.expectation(withDescription: "fetch") let fetchExpectation = self.expectation(description: "fetch")
var existing1 = [TestEntity1]() var existing1 = [TestEntity1]()
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
@@ -191,7 +191,7 @@ final class FetchTests: BaseTestDataTestCase {
} }
do { do {
let fetchExpectation = self.expectation(withDescription: "fetch") let fetchExpectation = self.expectation(description: "fetch")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
let existing1 = transaction.fetchExisting(objects) let existing1 = transaction.fetchExisting(objects)
+24 -24
View File
@@ -72,7 +72,7 @@ class ImportTests: BaseTestDataTestCase {
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let errorExpectation = self.expectation(withDescription: "error") let errorExpectation = self.expectation(description: "error")
do { do {
let _ = try transaction.importObject( let _ = try transaction.importObject(
@@ -215,8 +215,8 @@ class ImportTests: BaseTestDataTestCase {
XCTAssertEqual(object.testNumber, dictionary["testNumber"] as? NSNumber) XCTAssertEqual(object.testNumber, dictionary["testNumber"] as? NSNumber)
XCTAssertEqual(object.testDecimal, dictionary["testDecimal"] as? NSDecimalNumber) XCTAssertEqual(object.testDecimal, dictionary["testDecimal"] as? NSDecimalNumber)
XCTAssertEqual(object.testString, dictionary["testString"] as? String) XCTAssertEqual(object.testString, dictionary["testString"] as? String)
XCTAssertEqual(object.testData, dictionary["testData"] as? NSData) XCTAssertEqual(object.testData, dictionary["testData"] as? Data)
XCTAssertEqual(object.testDate, dictionary["testDate"] as? NSDate) XCTAssertEqual(object.testDate, dictionary["testDate"] as? Date)
} }
catch { catch {
@@ -234,7 +234,7 @@ class ImportTests: BaseTestDataTestCase {
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let errorExpectation = self.expectation(withDescription: "error") let errorExpectation = self.expectation(description: "error")
do { do {
let sourceArray: [TestEntity1.ImportSource] = [ let sourceArray: [TestEntity1.ImportSource] = [
@@ -331,8 +331,8 @@ class ImportTests: BaseTestDataTestCase {
XCTAssertEqual(object.testNumber, dictionary["testNumber"] as? NSNumber) XCTAssertEqual(object.testNumber, dictionary["testNumber"] as? NSNumber)
XCTAssertEqual(object.testDecimal, dictionary["testDecimal"] as? NSDecimalNumber) XCTAssertEqual(object.testDecimal, dictionary["testDecimal"] as? NSDecimalNumber)
XCTAssertEqual(object.testString, dictionary["testString"] as? String) XCTAssertEqual(object.testString, dictionary["testString"] as? String)
XCTAssertEqual(object.testData, dictionary["testData"] as? NSData) XCTAssertEqual(object.testData, dictionary["testData"] as? Data)
XCTAssertEqual(object.testDate, dictionary["testDate"] as? NSDate) XCTAssertEqual(object.testDate, dictionary["testDate"] as? Date)
} }
} }
catch { catch {
@@ -425,7 +425,7 @@ class ImportTests: BaseTestDataTestCase {
do { do {
let errorExpectation = self.expectation(withDescription: "error") let errorExpectation = self.expectation(description: "error")
do { do {
let _ = try transaction.importUniqueObject( let _ = try transaction.importUniqueObject(
@@ -466,7 +466,7 @@ class ImportTests: BaseTestDataTestCase {
} }
do { do {
let errorExpectation = self.expectation(withDescription: "error") let errorExpectation = self.expectation(description: "error")
do { do {
let _ = try transaction.importUniqueObject( let _ = try transaction.importUniqueObject(
@@ -639,8 +639,8 @@ class ImportTests: BaseTestDataTestCase {
XCTAssertEqual(object.testNumber, dictionary["testNumber"] as? NSNumber) XCTAssertEqual(object.testNumber, dictionary["testNumber"] as? NSNumber)
XCTAssertEqual(object.testDecimal, dictionary["testDecimal"] as? NSDecimalNumber) XCTAssertEqual(object.testDecimal, dictionary["testDecimal"] as? NSDecimalNumber)
XCTAssertEqual(object.testString, dictionary["testString"] as? String) XCTAssertEqual(object.testString, dictionary["testString"] as? String)
XCTAssertEqual(object.testData, dictionary["testData"] as? NSData) XCTAssertEqual(object.testData, dictionary["testData"] as? Data)
XCTAssertEqual(object.testDate, dictionary["testDate"] as? NSDate) XCTAssertEqual(object.testDate, dictionary["testDate"] as? Date)
} }
catch { catch {
@@ -660,7 +660,7 @@ class ImportTests: BaseTestDataTestCase {
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let errorExpectation = self.expectation(withDescription: "error") let errorExpectation = self.expectation(description: "error")
do { do {
let sourceArray: [TestEntity1.ImportSource] = [ let sourceArray: [TestEntity1.ImportSource] = [
@@ -707,7 +707,7 @@ class ImportTests: BaseTestDataTestCase {
} }
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let errorExpectation = self.expectation(withDescription: "error") let errorExpectation = self.expectation(description: "error")
do { do {
let sourceArray: [TestEntity1.ImportSource] = [ let sourceArray: [TestEntity1.ImportSource] = [
@@ -760,7 +760,7 @@ class ImportTests: BaseTestDataTestCase {
} }
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let errorExpectation = self.expectation(withDescription: "error") let errorExpectation = self.expectation(description: "error")
do { do {
let sourceArray: [TestEntity1.ImportSource] = [ let sourceArray: [TestEntity1.ImportSource] = [
@@ -860,8 +860,8 @@ class ImportTests: BaseTestDataTestCase {
XCTAssertEqual(object.testNumber, dictionary["testNumber"] as? NSNumber) XCTAssertEqual(object.testNumber, dictionary["testNumber"] as? NSNumber)
XCTAssertEqual(object.testDecimal, dictionary["testDecimal"] as? NSDecimalNumber) XCTAssertEqual(object.testDecimal, dictionary["testDecimal"] as? NSDecimalNumber)
XCTAssertEqual(object.testString, dictionary["testString"] as? String) XCTAssertEqual(object.testString, dictionary["testString"] as? String)
XCTAssertEqual(object.testData, dictionary["testData"] as? NSData) XCTAssertEqual(object.testData, dictionary["testData"] as? Data)
XCTAssertEqual(object.testDate, dictionary["testDate"] as? NSDate) XCTAssertEqual(object.testDate, dictionary["testDate"] as? Date)
} }
let existingObjects = transaction.fetchAll(From<TestEntity1>(), Where("testEntityID", isEqualTo: 105)) let existingObjects = transaction.fetchAll(From<TestEntity1>(), Where("testEntityID", isEqualTo: 105))
XCTAssertNotNil(existingObjects) XCTAssertNotNil(existingObjects)
@@ -883,17 +883,17 @@ class ImportTests: BaseTestDataTestCase {
// MARK: - TestInsertError // MARK: - TestInsertError
private struct TestInsertError: ErrorProtocol {} private struct TestInsertError: Error {}
// MARK: - TestUpdateError // MARK: - TestUpdateError
private struct TestUpdateError: ErrorProtocol {} private struct TestUpdateError: Error {}
// MARK: - TestIDError // MARK: - TestIDError
private struct TestIDError: ErrorProtocol {} private struct TestIDError: Error {}
// MARK: - TestEntity1 // MARK: - TestEntity1
@@ -902,14 +902,14 @@ extension TestEntity1: ImportableUniqueObject {
// MARK: ImportableObject // MARK: ImportableObject
typealias ImportSource = [String: AnyObject] typealias ImportSource = [String: Any]
static func shouldInsertFromImportSource(_ source: [String: AnyObject], inTransaction transaction: BaseDataTransaction) -> Bool { static func shouldInsertFromImportSource(_ source: ImportSource, inTransaction transaction: BaseDataTransaction) -> Bool {
return source["skip_insert"] == nil return source["skip_insert"] == nil
} }
func didInsertFromImportSource(_ source: [String: AnyObject], inTransaction transaction: BaseDataTransaction) throws { func didInsertFromImportSource(_ source: ImportSource, inTransaction transaction: BaseDataTransaction) throws {
if let _ = source["throw_on_insert"] { if let _ = source["throw_on_insert"] {
@@ -951,12 +951,12 @@ extension TestEntity1: ImportableUniqueObject {
} }
} }
static func shouldUpdateFromImportSource(_ source: [String: AnyObject], inTransaction transaction: BaseDataTransaction) -> Bool { static func shouldUpdateFromImportSource(_ source: ImportSource, inTransaction transaction: BaseDataTransaction) -> Bool {
return source["skip_update"] == nil return source["skip_update"] == nil
} }
static func uniqueIDFromImportSource(_ source: [String: AnyObject], inTransaction transaction: BaseDataTransaction) throws -> NSNumber? { static func uniqueIDFromImportSource(_ source: ImportSource, inTransaction transaction: BaseDataTransaction) throws -> NSNumber? {
if let _ = source["throw_on_id"] { if let _ = source["throw_on_id"] {
@@ -965,7 +965,7 @@ extension TestEntity1: ImportableUniqueObject {
return source["testEntityID"] as? NSNumber return source["testEntityID"] as? NSNumber
} }
func updateFromImportSource(_ source: [String: AnyObject], inTransaction transaction: BaseDataTransaction) throws { func updateFromImportSource(_ source: ImportSource, inTransaction transaction: BaseDataTransaction) throws {
if let _ = source["throw_on_update"] { if let _ = source["throw_on_update"] {
+24 -24
View File
@@ -60,7 +60,7 @@ class ListObserverTests: BaseTestDataTestCase {
handler: { (note) -> Bool in handler: { (note) -> Bool in
XCTAssertEqual(events, 0) XCTAssertEqual(events, 0)
XCTAssertEqual(((note as NSNotification).userInfo ?? [:]), NSDictionary()) XCTAssertEqual((note.userInfo as NSDictionary?) ?? [:], NSDictionary())
defer { defer {
events += 1 events += 1
@@ -75,7 +75,7 @@ class ListObserverTests: BaseTestDataTestCase {
XCTAssertEqual(events, 1) XCTAssertEqual(events, 1)
XCTAssertEqual( XCTAssertEqual(
((note as NSNotification).userInfo ?? [:]), ((note.userInfo as NSDictionary?) ?? [:]),
[ [
"sectionInfo": monitor.sectionInfoAtIndex(0), "sectionInfo": monitor.sectionInfoAtIndex(0),
"sectionIndex": 0 "sectionIndex": 0
@@ -95,10 +95,10 @@ class ListObserverTests: BaseTestDataTestCase {
XCTAssertEqual(events, 2) XCTAssertEqual(events, 2)
let userInfo = (note as NSNotification).userInfo let userInfo = note.userInfo
XCTAssertNotNil(userInfo) XCTAssertNotNil(userInfo)
XCTAssertEqual( XCTAssertEqual(
Set(((userInfo as? [String: AnyObject]) ?? [:]).keys), Set(userInfo?.keys.map({ $0 as! String }) ?? []),
["indexPath", "object"] ["indexPath", "object"]
) )
@@ -125,7 +125,7 @@ class ListObserverTests: BaseTestDataTestCase {
object: observer, object: observer,
handler: { (note) -> Bool in handler: { (note) -> Bool in
XCTAssertEqual(((note as NSNotification).userInfo ?? [:]), NSDictionary()) XCTAssertEqual((note.userInfo as NSDictionary?) ?? [:], NSDictionary())
defer { defer {
events += 1 events += 1
@@ -133,7 +133,7 @@ class ListObserverTests: BaseTestDataTestCase {
return events == 3 return events == 3
} }
) )
let saveExpectation = self.expectation(withDescription: "save") let saveExpectation = self.expectation(description: "save")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
let object = transaction.create(Into<TestEntity1>()) let object = transaction.create(Into<TestEntity1>())
@@ -191,7 +191,7 @@ class ListObserverTests: BaseTestDataTestCase {
handler: { (note) -> Bool in handler: { (note) -> Bool in
XCTAssertEqual(events, 0) XCTAssertEqual(events, 0)
XCTAssertEqual(((note as NSNotification).userInfo ?? [:]), NSDictionary()) XCTAssertEqual((note.userInfo as NSDictionary?) ?? [:], NSDictionary())
defer { defer {
events += 1 events += 1
@@ -208,10 +208,10 @@ class ListObserverTests: BaseTestDataTestCase {
XCTAssert(events == 1 || events == 2) XCTAssert(events == 1 || events == 2)
let userInfo = (note as NSNotification).userInfo let userInfo = note.userInfo
XCTAssertNotNil(userInfo) XCTAssertNotNil(userInfo)
XCTAssertEqual( XCTAssertEqual(
Set(((userInfo as? [String: AnyObject]) ?? [:]).keys), Set(userInfo?.keys.map({ $0 as! String }) ?? []),
["indexPath", "object"] ["indexPath", "object"]
) )
@@ -259,7 +259,7 @@ class ListObserverTests: BaseTestDataTestCase {
handler: { (note) -> Bool in handler: { (note) -> Bool in
XCTAssertEqual(events, 3) XCTAssertEqual(events, 3)
XCTAssertEqual(((note as NSNotification).userInfo ?? [:]), NSDictionary()) XCTAssertEqual((note.userInfo as NSDictionary?) ?? [:], NSDictionary())
defer { defer {
events += 1 events += 1
@@ -267,7 +267,7 @@ class ListObserverTests: BaseTestDataTestCase {
return events == 3 return events == 3
} }
) )
let saveExpectation = self.expectation(withDescription: "save") let saveExpectation = self.expectation(description: "save")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
if let object = transaction.fetchOne( if let object = transaction.fetchOne(
@@ -338,7 +338,7 @@ class ListObserverTests: BaseTestDataTestCase {
handler: { (note) -> Bool in handler: { (note) -> Bool in
XCTAssertEqual(events, 0) XCTAssertEqual(events, 0)
XCTAssertEqual(((note as NSNotification).userInfo ?? [:]), NSDictionary()) XCTAssertEqual((note.userInfo as NSDictionary?) ?? [:], NSDictionary())
defer { defer {
events += 1 events += 1
@@ -353,10 +353,10 @@ class ListObserverTests: BaseTestDataTestCase {
XCTAssertEqual(events, 1) XCTAssertEqual(events, 1)
let userInfo = (note as NSNotification).userInfo let userInfo = note.userInfo
XCTAssertNotNil(userInfo) XCTAssertNotNil(userInfo)
XCTAssertEqual( XCTAssertEqual(
Set(((userInfo as? [String: AnyObject]) ?? [:]).keys), Set(userInfo?.keys.map({ $0 as! String }) ?? []),
["fromIndexPath", "toIndexPath", "object"] ["fromIndexPath", "toIndexPath", "object"]
) )
@@ -385,7 +385,7 @@ class ListObserverTests: BaseTestDataTestCase {
handler: { (note) -> Bool in handler: { (note) -> Bool in
XCTAssertEqual(events, 2) XCTAssertEqual(events, 2)
XCTAssertEqual(((note as NSNotification).userInfo ?? [:]), NSDictionary()) XCTAssertEqual((note.userInfo as NSDictionary?) ?? [:], NSDictionary())
defer { defer {
events += 1 events += 1
@@ -393,7 +393,7 @@ class ListObserverTests: BaseTestDataTestCase {
return events == 2 return events == 2
} }
) )
let saveExpectation = self.expectation(withDescription: "save") let saveExpectation = self.expectation(description: "save")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
if let object = transaction.fetchOne( if let object = transaction.fetchOne(
@@ -446,7 +446,7 @@ class ListObserverTests: BaseTestDataTestCase {
handler: { (note) -> Bool in handler: { (note) -> Bool in
XCTAssertEqual(events, 0) XCTAssertEqual(events, 0)
XCTAssertEqual(((note as NSNotification).userInfo ?? [:]), NSDictionary()) XCTAssertEqual((note.userInfo as NSDictionary?) ?? [:], NSDictionary())
defer { defer {
events += 1 events += 1
@@ -463,10 +463,10 @@ class ListObserverTests: BaseTestDataTestCase {
XCTAssert(events == 1 || events == 2) XCTAssert(events == 1 || events == 2)
let userInfo = (note as NSNotification).userInfo let userInfo = note.userInfo
XCTAssertNotNil(userInfo) XCTAssertNotNil(userInfo)
XCTAssertEqual( XCTAssertEqual(
Set(((userInfo as? [String: AnyObject]) ?? [:]).keys), Set(userInfo?.keys.map({ $0 as! String }) ?? []),
["indexPath", "object"] ["indexPath", "object"]
) )
@@ -493,14 +493,14 @@ class ListObserverTests: BaseTestDataTestCase {
XCTAssertEqual(events, 3) XCTAssertEqual(events, 3)
let userInfo = (note as NSNotification).userInfo let userInfo = note.userInfo
XCTAssertNotNil(userInfo) XCTAssertNotNil(userInfo)
XCTAssertEqual( XCTAssertEqual(
Set(((userInfo as? [String: AnyObject]) ?? [:]).keys), Set(userInfo?.keys.map({ $0 as! String }) ?? []),
["sectionInfo", "sectionIndex"] ["sectionInfo", "sectionIndex"]
) )
let sectionInfo = userInfo?["sectionInfo"] let sectionInfo = userInfo?["sectionInfo"] as? NSFetchedResultsSectionInfo
XCTAssertNotNil(sectionInfo) XCTAssertNotNil(sectionInfo)
XCTAssertEqual(sectionInfo?.name, "0") XCTAssertEqual(sectionInfo?.name, "0")
@@ -520,7 +520,7 @@ class ListObserverTests: BaseTestDataTestCase {
handler: { (note) -> Bool in handler: { (note) -> Bool in
XCTAssertEqual(events, 4) XCTAssertEqual(events, 4)
XCTAssertEqual(((note as NSNotification).userInfo ?? [:]), NSDictionary()) XCTAssertEqual((note.userInfo as NSDictionary?) ?? [:], NSDictionary())
defer { defer {
events += 1 events += 1
@@ -528,7 +528,7 @@ class ListObserverTests: BaseTestDataTestCase {
return events == 4 return events == 4
} }
) )
let saveExpectation = self.expectation(withDescription: "save") let saveExpectation = self.expectation(description: "save")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
transaction.deleteAll( transaction.deleteAll(
+5 -5
View File
@@ -65,7 +65,7 @@ class ObjectObserverTests: BaseTestDataTestCase {
XCTAssertEqual(events, 0) XCTAssertEqual(events, 0)
XCTAssertEqual( XCTAssertEqual(
((note as NSNotification).userInfo ?? [:]), ((note.userInfo as NSDictionary?) ?? [:]),
["object": object] as NSDictionary ["object": object] as NSDictionary
) )
defer { defer {
@@ -82,7 +82,7 @@ class ObjectObserverTests: BaseTestDataTestCase {
XCTAssertEqual(events, 1) XCTAssertEqual(events, 1)
XCTAssertEqual( XCTAssertEqual(
((note as NSNotification).userInfo ?? [:]), ((note.userInfo as NSDictionary?) ?? [:]),
[ [
"object": object, "object": object,
"changedPersistentKeys": Set( "changedPersistentKeys": Set(
@@ -104,7 +104,7 @@ class ObjectObserverTests: BaseTestDataTestCase {
return events == 1 return events == 1
} }
) )
let saveExpectation = self.expectation(withDescription: "save") let saveExpectation = self.expectation(description: "save")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
guard let object = transaction.edit(object) else { guard let object = transaction.edit(object) else {
@@ -162,7 +162,7 @@ class ObjectObserverTests: BaseTestDataTestCase {
XCTAssertEqual(events, 0) XCTAssertEqual(events, 0)
XCTAssertEqual( XCTAssertEqual(
((note as NSNotification).userInfo ?? [:]), ((note.userInfo as NSDictionary?) ?? [:]),
["object": object] as NSDictionary ["object": object] as NSDictionary
) )
defer { defer {
@@ -172,7 +172,7 @@ class ObjectObserverTests: BaseTestDataTestCase {
return events == 0 return events == 0
} }
) )
let saveExpectation = self.expectation(withDescription: "save") let saveExpectation = self.expectation(description: "save")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
guard let object = transaction.edit(object) else { guard let object = transaction.edit(object) else {
+17 -17
View File
@@ -39,27 +39,27 @@ final class OrderByTests: XCTestCase {
do { do {
let orderBy = OrderBy() let orderBy = OrderBy()
XCTAssertEqual(orderBy, OrderBy([SortDescriptor]())) XCTAssertEqual(orderBy, OrderBy([NSSortDescriptor]()))
XCTAssertNotEqual(orderBy, OrderBy(SortDescriptor(key: "key", ascending: false))) XCTAssertNotEqual(orderBy, OrderBy(NSSortDescriptor(key: "key", ascending: false)))
XCTAssertTrue(orderBy.sortDescriptors.isEmpty) XCTAssertTrue(orderBy.sortDescriptors.isEmpty)
} }
do { do {
let sortDescriptor = SortDescriptor(key: "key1", ascending: true) let sortDescriptor = NSSortDescriptor(key: "key1", ascending: true)
let orderBy = OrderBy(sortDescriptor) let orderBy = OrderBy(sortDescriptor)
XCTAssertEqual(orderBy, OrderBy(sortDescriptor)) XCTAssertEqual(orderBy, OrderBy(sortDescriptor))
XCTAssertEqual(orderBy, OrderBy(.ascending("key1"))) XCTAssertEqual(orderBy, OrderBy(.ascending("key1")))
XCTAssertNotEqual(orderBy, OrderBy(.ascending("key2"))) XCTAssertNotEqual(orderBy, OrderBy(.ascending("key2")))
XCTAssertNotEqual(orderBy, OrderBy(.descending("key1"))) XCTAssertNotEqual(orderBy, OrderBy(.descending("key1")))
XCTAssertNotEqual(orderBy, OrderBy(SortDescriptor(key: "key1", ascending: false))) XCTAssertNotEqual(orderBy, OrderBy(NSSortDescriptor(key: "key1", ascending: false)))
XCTAssertEqual(orderBy, OrderBy([sortDescriptor])) XCTAssertEqual(orderBy, OrderBy([sortDescriptor]))
XCTAssertEqual(orderBy.sortDescriptors, [sortDescriptor]) XCTAssertEqual(orderBy.sortDescriptors, [sortDescriptor])
} }
do { do {
let sortDescriptors = [ let sortDescriptors = [
SortDescriptor(key: "key1", ascending: true), NSSortDescriptor(key: "key1", ascending: true),
SortDescriptor(key: "key2", ascending: false) NSSortDescriptor(key: "key2", ascending: false)
] ]
let orderBy = OrderBy(sortDescriptors) let orderBy = OrderBy(sortDescriptors)
XCTAssertEqual(orderBy, OrderBy(sortDescriptors)) XCTAssertEqual(orderBy, OrderBy(sortDescriptors))
@@ -68,8 +68,8 @@ final class OrderByTests: XCTestCase {
orderBy, orderBy,
OrderBy( OrderBy(
[ [
SortDescriptor(key: "key1", ascending: false), NSSortDescriptor(key: "key1", ascending: false),
SortDescriptor(key: "key2", ascending: false) NSSortDescriptor(key: "key2", ascending: false)
] ]
) )
) )
@@ -80,7 +80,7 @@ final class OrderByTests: XCTestCase {
do { do {
let orderBy = OrderBy(.ascending("key1")) let orderBy = OrderBy(.ascending("key1"))
let sortDescriptor = SortDescriptor(key: "key1", ascending: true) let sortDescriptor = NSSortDescriptor(key: "key1", ascending: true)
XCTAssertEqual(orderBy, OrderBy(sortDescriptor)) XCTAssertEqual(orderBy, OrderBy(sortDescriptor))
XCTAssertEqual(orderBy, OrderBy(.ascending("key1"))) XCTAssertEqual(orderBy, OrderBy(.ascending("key1")))
XCTAssertNotEqual(orderBy, OrderBy(.descending("key1"))) XCTAssertNotEqual(orderBy, OrderBy(.descending("key1")))
@@ -92,8 +92,8 @@ final class OrderByTests: XCTestCase {
let orderBy = OrderBy(.ascending("key1"), .descending("key2")) let orderBy = OrderBy(.ascending("key1"), .descending("key2"))
let sortDescriptors = [ let sortDescriptors = [
SortDescriptor(key: "key1", ascending: true), NSSortDescriptor(key: "key1", ascending: true),
SortDescriptor(key: "key2", ascending: false) NSSortDescriptor(key: "key2", ascending: false)
] ]
XCTAssertEqual(orderBy, OrderBy(sortDescriptors)) XCTAssertEqual(orderBy, OrderBy(sortDescriptors))
XCTAssertEqual(orderBy, OrderBy(.ascending("key1"), .descending("key2"))) XCTAssertEqual(orderBy, OrderBy(.ascending("key1"), .descending("key2")))
@@ -101,8 +101,8 @@ final class OrderByTests: XCTestCase {
orderBy, orderBy,
OrderBy( OrderBy(
[ [
SortDescriptor(key: "key1", ascending: false), NSSortDescriptor(key: "key1", ascending: false),
SortDescriptor(key: "key2", ascending: false) NSSortDescriptor(key: "key2", ascending: false)
] ]
) )
) )
@@ -115,8 +115,8 @@ final class OrderByTests: XCTestCase {
let sortKeys: [SortKey] = [.ascending("key1"), .descending("key2")] let sortKeys: [SortKey] = [.ascending("key1"), .descending("key2")]
let orderBy = OrderBy(sortKeys) let orderBy = OrderBy(sortKeys)
let sortDescriptors = [ let sortDescriptors = [
SortDescriptor(key: "key1", ascending: true), NSSortDescriptor(key: "key1", ascending: true),
SortDescriptor(key: "key2", ascending: false) NSSortDescriptor(key: "key2", ascending: false)
] ]
XCTAssertEqual(orderBy, OrderBy(sortDescriptors)) XCTAssertEqual(orderBy, OrderBy(sortDescriptors))
XCTAssertEqual(orderBy, OrderBy(.ascending("key1"), .descending("key2"))) XCTAssertEqual(orderBy, OrderBy(.ascending("key1"), .descending("key2")))
@@ -124,8 +124,8 @@ final class OrderByTests: XCTestCase {
orderBy, orderBy,
OrderBy( OrderBy(
[ [
SortDescriptor(key: "key1", ascending: false), NSSortDescriptor(key: "key1", ascending: false),
SortDescriptor(key: "key2", ascending: false) NSSortDescriptor(key: "key2", ascending: false)
] ]
) )
) )
+17 -17
View File
@@ -173,7 +173,7 @@ class QueryTests: BaseTestDataTestCase {
queryClauses queryClauses
) )
XCTAssertNotNil(value) XCTAssertNotNil(value)
XCTAssertEqual(value, ("nil:TestEntity1:1" as NSString).data(using: String.Encoding.utf8.rawValue)) XCTAssertEqual(value as Data?, "nil:TestEntity1:1".data(using: .utf8))
} }
do { do {
@@ -183,7 +183,7 @@ class QueryTests: BaseTestDataTestCase {
queryClauses queryClauses
) )
XCTAssertNotNil(value) XCTAssertNotNil(value)
XCTAssertEqual(value, self.dateFormatter.date(from: "2000-01-01T00:00:00Z")) XCTAssertEqual(value as Date?, self.dateFormatter.date(from: "2000-01-01T00:00:00Z"))
} }
do { do {
@@ -657,7 +657,7 @@ class QueryTests: BaseTestDataTestCase {
queryClauses queryClauses
) )
XCTAssertNotNil(value) XCTAssertNotNil(value)
XCTAssertEqual(value, ("nil:TestEntity1:5" as NSString).data(using: String.Encoding.utf8.rawValue)) XCTAssertEqual(value as Data?, "nil:TestEntity1:5".data(using: .utf8))
} }
do { do {
@@ -667,7 +667,7 @@ class QueryTests: BaseTestDataTestCase {
queryClauses queryClauses
) )
XCTAssertNotNil(value) XCTAssertNotNil(value)
XCTAssertEqual(value, self.dateFormatter.date(from: "2000-01-05T00:00:00Z")) XCTAssertEqual(value as Date?, self.dateFormatter.date(from: "2000-01-05T00:00:00Z"))
} }
do { do {
@@ -821,7 +821,7 @@ class QueryTests: BaseTestDataTestCase {
queryClauses queryClauses
) )
XCTAssertNotNil(value) XCTAssertNotNil(value)
XCTAssertEqual(value, ("nil:TestEntity1:2" as NSString).data(using: String.Encoding.utf8.rawValue)) XCTAssertEqual(value as Data?, "nil:TestEntity1:2".data(using: .utf8))
} }
do { do {
@@ -831,7 +831,7 @@ class QueryTests: BaseTestDataTestCase {
queryClauses queryClauses
) )
XCTAssertNotNil(value) XCTAssertNotNil(value)
XCTAssertEqual(value, self.dateFormatter.date(from: "2000-01-02T00:00:00Z")) XCTAssertEqual(value as Date?, self.dateFormatter.date(from: "2000-01-02T00:00:00Z"))
} }
do { do {
@@ -1170,7 +1170,7 @@ class QueryTests: BaseTestDataTestCase {
] ]
do { do {
let values = stack.queryAttributes( let values: [NSDictionary]? = stack.queryAttributes(
from, from,
Select( Select(
"testBoolean", "testBoolean",
@@ -1203,7 +1203,7 @@ class QueryTests: BaseTestDataTestCase {
"testData": ("nil:TestEntity1:5" as NSString).data(using: String.Encoding.utf8.rawValue)!, "testData": ("nil:TestEntity1:5" as NSString).data(using: String.Encoding.utf8.rawValue)!,
"testDate": self.dateFormatter.date(from: "2000-01-05T00:00:00Z")! "testDate": self.dateFormatter.date(from: "2000-01-05T00:00:00Z")!
] ]
] ] as [NSDictionary]
) )
} }
} }
@@ -1221,7 +1221,7 @@ class QueryTests: BaseTestDataTestCase {
let queryClauses: [QueryClause] = [] let queryClauses: [QueryClause] = []
do { do {
let values = stack.queryAttributes( let values: [NSDictionary]? = stack.queryAttributes(
from, from,
Select( Select(
.sum("testBoolean"), .sum("testBoolean"),
@@ -1243,19 +1243,19 @@ class QueryTests: BaseTestDataTestCase {
"min(testNumber)": 1, "min(testNumber)": 1,
"average(testDecimal)": 3, "average(testDecimal)": 3,
] ]
] ] as [NSDictionary]
) )
} }
do { do {
let values = stack.queryAttributes( let values: [NSDictionary]? = stack.queryAttributes(
from, from,
Select( Select(
.sum("testBoolean", As: "testSum"), .sum("testBoolean", as: "testSum"),
.count("testNumber", As: "testCount"), .count("testNumber", as: "testCount"),
.maximum("testNumber", As: "testMaximum"), .maximum("testNumber", as: "testMaximum"),
.minimum("testNumber", As: "testMinimum"), .minimum("testNumber", as: "testMinimum"),
.average("testDecimal", As: "testAverage") .average("testDecimal", as: "testAverage")
), ),
queryClauses queryClauses
) )
@@ -1270,7 +1270,7 @@ class QueryTests: BaseTestDataTestCase {
"testMinimum": 1, "testMinimum": 1,
"testAverage": 3, "testAverage": 3,
] ]
] ] as [NSDictionary]
) )
} }
} }
+3 -3
View File
@@ -42,14 +42,14 @@ final class SectionByTests: XCTestCase {
let sectionBy = SectionBy("key") let sectionBy = SectionBy("key")
XCTAssertEqual(sectionBy.sectionKeyPath, "key") XCTAssertEqual(sectionBy.sectionKeyPath, "key")
XCTAssertEqual(sectionBy.sectionIndexTransformer(sectionName: "key"), "key") XCTAssertEqual(sectionBy.sectionIndexTransformer("key"), "key")
} }
do { do {
let sectionBy = SectionBy("key") { $0.flatMap { "\($0):suffix" } } let sectionBy = SectionBy("key") { $0.flatMap { "\($0):suffix" } }
XCTAssertEqual(sectionBy.sectionKeyPath, "key") XCTAssertEqual(sectionBy.sectionKeyPath, "key")
XCTAssertEqual(sectionBy.sectionIndexTransformer(sectionName: "key"), "key:suffix") XCTAssertEqual(sectionBy.sectionIndexTransformer("key"), "key:suffix")
XCTAssertNil(sectionBy.sectionIndexTransformer(sectionName: nil)) XCTAssertNil(sectionBy.sectionIndexTransformer(nil))
} }
} }
} }
+24 -24
View File
@@ -84,7 +84,7 @@ final class SelectTests: XCTestCase {
let term = SelectTerm.average("attribute") let term = SelectTerm.average("attribute")
XCTAssertEqual(term, SelectTerm.average("attribute")) XCTAssertEqual(term, SelectTerm.average("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute", As: "alias")) XCTAssertNotEqual(term, SelectTerm.average("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.average("attribute2")) XCTAssertNotEqual(term, SelectTerm.average("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.count("attribute")) XCTAssertNotEqual(term, SelectTerm.count("attribute"))
@@ -106,9 +106,9 @@ final class SelectTests: XCTestCase {
} }
do { do {
let term = SelectTerm.average("attribute", As: "alias") let term = SelectTerm.average("attribute", as: "alias")
XCTAssertEqual(term, SelectTerm.average("attribute", As: "alias")) XCTAssertEqual(term, SelectTerm.average("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.average("attribute", As: "alias2")) XCTAssertNotEqual(term, SelectTerm.average("attribute", as: "alias2"))
XCTAssertNotEqual(term, SelectTerm.average("attribute2")) XCTAssertNotEqual(term, SelectTerm.average("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.count("attribute")) XCTAssertNotEqual(term, SelectTerm.count("attribute"))
@@ -137,7 +137,7 @@ final class SelectTests: XCTestCase {
let term = SelectTerm.count("attribute") let term = SelectTerm.count("attribute")
XCTAssertEqual(term, SelectTerm.count("attribute")) XCTAssertEqual(term, SelectTerm.count("attribute"))
XCTAssertNotEqual(term, SelectTerm.count("attribute", As: "alias")) XCTAssertNotEqual(term, SelectTerm.count("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.count("attribute2")) XCTAssertNotEqual(term, SelectTerm.count("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
@@ -159,9 +159,9 @@ final class SelectTests: XCTestCase {
} }
do { do {
let term = SelectTerm.count("attribute", As: "alias") let term = SelectTerm.count("attribute", as: "alias")
XCTAssertEqual(term, SelectTerm.count("attribute", As: "alias")) XCTAssertEqual(term, SelectTerm.count("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.count("attribute", As: "alias2")) XCTAssertNotEqual(term, SelectTerm.count("attribute", as: "alias2"))
XCTAssertNotEqual(term, SelectTerm.count("attribute2")) XCTAssertNotEqual(term, SelectTerm.count("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
@@ -190,7 +190,7 @@ final class SelectTests: XCTestCase {
let term = SelectTerm.maximum("attribute") let term = SelectTerm.maximum("attribute")
XCTAssertEqual(term, SelectTerm.maximum("attribute")) XCTAssertEqual(term, SelectTerm.maximum("attribute"))
XCTAssertNotEqual(term, SelectTerm.maximum("attribute", As: "alias")) XCTAssertNotEqual(term, SelectTerm.maximum("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.maximum("attribute2")) XCTAssertNotEqual(term, SelectTerm.maximum("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
@@ -212,9 +212,9 @@ final class SelectTests: XCTestCase {
} }
do { do {
let term = SelectTerm.maximum("attribute", As: "alias") let term = SelectTerm.maximum("attribute", as: "alias")
XCTAssertEqual(term, SelectTerm.maximum("attribute", As: "alias")) XCTAssertEqual(term, SelectTerm.maximum("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.maximum("attribute", As: "alias2")) XCTAssertNotEqual(term, SelectTerm.maximum("attribute", as: "alias2"))
XCTAssertNotEqual(term, SelectTerm.maximum("attribute2")) XCTAssertNotEqual(term, SelectTerm.maximum("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
@@ -243,7 +243,7 @@ final class SelectTests: XCTestCase {
let term = SelectTerm.minimum("attribute") let term = SelectTerm.minimum("attribute")
XCTAssertEqual(term, SelectTerm.minimum("attribute")) XCTAssertEqual(term, SelectTerm.minimum("attribute"))
XCTAssertNotEqual(term, SelectTerm.minimum("attribute", As: "alias")) XCTAssertNotEqual(term, SelectTerm.minimum("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.minimum("attribute2")) XCTAssertNotEqual(term, SelectTerm.minimum("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
@@ -265,9 +265,9 @@ final class SelectTests: XCTestCase {
} }
do { do {
let term = SelectTerm.minimum("attribute", As: "alias") let term = SelectTerm.minimum("attribute", as: "alias")
XCTAssertEqual(term, SelectTerm.minimum("attribute", As: "alias")) XCTAssertEqual(term, SelectTerm.minimum("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.minimum("attribute", As: "alias2")) XCTAssertNotEqual(term, SelectTerm.minimum("attribute", as: "alias2"))
XCTAssertNotEqual(term, SelectTerm.minimum("attribute2")) XCTAssertNotEqual(term, SelectTerm.minimum("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
@@ -296,7 +296,7 @@ final class SelectTests: XCTestCase {
let term = SelectTerm.sum("attribute") let term = SelectTerm.sum("attribute")
XCTAssertEqual(term, SelectTerm.sum("attribute")) XCTAssertEqual(term, SelectTerm.sum("attribute"))
XCTAssertNotEqual(term, SelectTerm.sum("attribute", As: "alias")) XCTAssertNotEqual(term, SelectTerm.sum("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.sum("attribute2")) XCTAssertNotEqual(term, SelectTerm.sum("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
@@ -318,9 +318,9 @@ final class SelectTests: XCTestCase {
} }
do { do {
let term = SelectTerm.sum("attribute", As: "alias") let term = SelectTerm.sum("attribute", as: "alias")
XCTAssertEqual(term, SelectTerm.sum("attribute", As: "alias")) XCTAssertEqual(term, SelectTerm.sum("attribute", as: "alias"))
XCTAssertNotEqual(term, SelectTerm.sum("attribute", As: "alias2")) XCTAssertNotEqual(term, SelectTerm.sum("attribute", as: "alias2"))
XCTAssertNotEqual(term, SelectTerm.sum("attribute2")) XCTAssertNotEqual(term, SelectTerm.sum("attribute2"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
@@ -349,7 +349,7 @@ final class SelectTests: XCTestCase {
let term = SelectTerm.objectID() let term = SelectTerm.objectID()
XCTAssertEqual(term, SelectTerm.objectID()) XCTAssertEqual(term, SelectTerm.objectID())
XCTAssertNotEqual(term, SelectTerm.objectID(As: "alias")) XCTAssertNotEqual(term, SelectTerm.objectID(as: "alias"))
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
XCTAssertNotEqual(term, SelectTerm.count("attribute")) XCTAssertNotEqual(term, SelectTerm.count("attribute"))
@@ -368,9 +368,9 @@ final class SelectTests: XCTestCase {
} }
do { do {
let term = SelectTerm.objectID(As: "alias") let term = SelectTerm.objectID(as: "alias")
XCTAssertEqual(term, SelectTerm.objectID(As: "alias")) XCTAssertEqual(term, SelectTerm.objectID(as: "alias"))
XCTAssertNotEqual(term, SelectTerm.objectID(As: "alias2")) XCTAssertNotEqual(term, SelectTerm.objectID(as: "alias2"))
XCTAssertNotEqual(term, SelectTerm.objectID()) XCTAssertNotEqual(term, SelectTerm.objectID())
XCTAssertNotEqual(term, SelectTerm.attribute("attribute")) XCTAssertNotEqual(term, SelectTerm.attribute("attribute"))
XCTAssertNotEqual(term, SelectTerm.average("attribute")) XCTAssertNotEqual(term, SelectTerm.average("attribute"))
+5 -5
View File
@@ -36,7 +36,7 @@ class SetupTests: BaseTestCase {
do { do {
let model = NSManagedObjectModel.mergedModel(from: [Bundle(for: self.dynamicType)])! let model = NSManagedObjectModel.mergedModel(from: [Bundle(for: type(of: self))])!
let stack = DataStack(model: model, migrationChain: nil) let stack = DataStack(model: model, migrationChain: nil)
XCTAssertEqual(stack.coordinator.managedObjectModel, model) XCTAssertEqual(stack.coordinator.managedObjectModel, model)
@@ -60,7 +60,7 @@ class SetupTests: BaseTestCase {
DataStack( DataStack(
modelName: "Model", modelName: "Model",
bundle: Bundle(for: self.dynamicType), bundle: Bundle(for: type(of: self)),
migrationChain: migrationChain migrationChain: migrationChain
) )
} }
@@ -77,7 +77,7 @@ class SetupTests: BaseTestCase {
let stack = DataStack( let stack = DataStack(
modelName: "Model", modelName: "Model",
bundle: Bundle(for: self.dynamicType) bundle: Bundle(for: type(of: self))
) )
do { do {
@@ -132,7 +132,7 @@ class SetupTests: BaseTestCase {
let stack = DataStack( let stack = DataStack(
modelName: "Model", modelName: "Model",
bundle: Bundle(for: self.dynamicType) bundle: Bundle(for: type(of: self))
) )
do { do {
@@ -194,7 +194,7 @@ class SetupTests: BaseTestCase {
let stack = DataStack( let stack = DataStack(
modelName: "Model", modelName: "Model",
bundle: Bundle(for: self.dynamicType) bundle: Bundle(for: type(of: self))
) )
do { do {
+30 -31
View File
@@ -37,7 +37,7 @@ final class StorageInterfaceTests: XCTestCase {
dynamic func test_ThatDefaultInMemoryStores_ConfigureCorrectly() { dynamic func test_ThatDefaultInMemoryStores_ConfigureCorrectly() {
let store = InMemoryStore() let store = InMemoryStore()
XCTAssertEqual(store.dynamicType.storeType, NSInMemoryStoreType) XCTAssertEqual(type(of: store).storeType, NSInMemoryStoreType)
XCTAssertNil(store.configuration) XCTAssertNil(store.configuration)
XCTAssertNil(store.storeOptions) XCTAssertNil(store.storeOptions)
} }
@@ -46,7 +46,7 @@ final class StorageInterfaceTests: XCTestCase {
dynamic func test_ThatCustomInMemoryStores_ConfigureCorrectly() { dynamic func test_ThatCustomInMemoryStores_ConfigureCorrectly() {
let store = InMemoryStore(configuration: "config1") let store = InMemoryStore(configuration: "config1")
XCTAssertEqual(store.dynamicType.storeType, NSInMemoryStoreType) XCTAssertEqual(type(of: store).storeType, NSInMemoryStoreType)
XCTAssertEqual(store.configuration, "config1") XCTAssertEqual(store.configuration, "config1")
XCTAssertNil(store.storeOptions) XCTAssertNil(store.storeOptions)
} }
@@ -61,15 +61,15 @@ final class StorageInterfaceTests: XCTestCase {
#endif #endif
let defaultSystemDirectory = FileManager.default let defaultSystemDirectory = FileManager.default
.urlsForDirectory(systemDirectorySearchPath, inDomains: .userDomainMask).first! .urls(for: systemDirectorySearchPath, in: .userDomainMask).first!
let defaultRootDirectory = try! defaultSystemDirectory.appendingPathComponent( let defaultRootDirectory = defaultSystemDirectory.appendingPathComponent(
Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack", Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack",
isDirectory: true isDirectory: true
) )
let applicationName = (Bundle.main.objectForInfoDictionaryKey("CFBundleName") as? String) ?? "CoreData" let applicationName = (Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String) ?? "CoreData"
let defaultFileURL = try! defaultRootDirectory let defaultFileURL = defaultRootDirectory
.appendingPathComponent(applicationName, isDirectory: false) .appendingPathComponent(applicationName, isDirectory: false)
.appendingPathExtension("sqlite") .appendingPathExtension("sqlite")
@@ -81,9 +81,9 @@ final class StorageInterfaceTests: XCTestCase {
dynamic func test_ThatDefaultSQLiteStores_ConfigureCorrectly() { dynamic func test_ThatDefaultSQLiteStores_ConfigureCorrectly() {
let store = SQLiteStore() let store = SQLiteStore()
XCTAssertEqual(store.dynamicType.storeType, NSSQLiteStoreType) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType)
XCTAssertNil(store.configuration) XCTAssertNil(store.configuration)
XCTAssertEqual(store.storeOptions, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary) XCTAssertEqual(store.storeOptions as NSDictionary?, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)
XCTAssertEqual(store.fileURL, SQLiteStore.defaultFileURL) XCTAssertEqual(store.fileURL, SQLiteStore.defaultFileURL)
XCTAssertEqual(store.mappingModelBundles, Bundle.allBundles) XCTAssertEqual(store.mappingModelBundles, Bundle.allBundles)
@@ -93,10 +93,10 @@ final class StorageInterfaceTests: XCTestCase {
@objc @objc
dynamic func test_ThatFileURLSQLiteStores_ConfigureCorrectly() { dynamic func test_ThatFileURLSQLiteStores_ConfigureCorrectly() {
let fileURL = try! URL(fileURLWithPath: NSTemporaryDirectory()) let fileURL = URL(fileURLWithPath: NSTemporaryDirectory())
.appendingPathComponent(UUID().uuidString, isDirectory: false) .appendingPathComponent(UUID().uuidString, isDirectory: false)
.appendingPathExtension("db") .appendingPathExtension("db")
let bundles = [Bundle(for: self.dynamicType)] let bundles = [Bundle(for: type(of: self))]
let store = SQLiteStore( let store = SQLiteStore(
fileURL: fileURL, fileURL: fileURL,
@@ -104,9 +104,9 @@ final class StorageInterfaceTests: XCTestCase {
mappingModelBundles: bundles, mappingModelBundles: bundles,
localStorageOptions: .recreateStoreOnModelMismatch localStorageOptions: .recreateStoreOnModelMismatch
) )
XCTAssertEqual(store.dynamicType.storeType, NSSQLiteStoreType) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType)
XCTAssertEqual(store.configuration, "config1") XCTAssertEqual(store.configuration, "config1")
XCTAssertEqual(store.storeOptions, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary) XCTAssertEqual(store.storeOptions as NSDictionary?, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)
XCTAssertEqual(store.fileURL, fileURL) XCTAssertEqual(store.fileURL, fileURL)
XCTAssertEqual(store.mappingModelBundles, bundles) XCTAssertEqual(store.mappingModelBundles, bundles)
@@ -117,7 +117,7 @@ final class StorageInterfaceTests: XCTestCase {
dynamic func test_ThatFileNameSQLiteStores_ConfigureCorrectly() { dynamic func test_ThatFileNameSQLiteStores_ConfigureCorrectly() {
let fileName = UUID().uuidString + ".db" let fileName = UUID().uuidString + ".db"
let bundles = [Bundle(for: self.dynamicType)] let bundles = [Bundle(for: type(of: self))]
let store = SQLiteStore( let store = SQLiteStore(
fileName: fileName, fileName: fileName,
@@ -125,11 +125,11 @@ final class StorageInterfaceTests: XCTestCase {
mappingModelBundles: bundles, mappingModelBundles: bundles,
localStorageOptions: .recreateStoreOnModelMismatch localStorageOptions: .recreateStoreOnModelMismatch
) )
XCTAssertEqual(store.dynamicType.storeType, NSSQLiteStoreType) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType)
XCTAssertEqual(store.configuration, "config1") XCTAssertEqual(store.configuration, "config1")
XCTAssertEqual(store.storeOptions, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary) XCTAssertEqual(store.storeOptions as NSDictionary?, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)
XCTAssertEqual(try! store.fileURL.deletingLastPathComponent(), SQLiteStore.defaultRootDirectory) XCTAssertEqual(store.fileURL.deletingLastPathComponent(), SQLiteStore.defaultRootDirectory)
XCTAssertEqual(store.fileURL.lastPathComponent, fileName) XCTAssertEqual(store.fileURL.lastPathComponent, fileName)
XCTAssertEqual(store.mappingModelBundles, bundles) XCTAssertEqual(store.mappingModelBundles, bundles)
XCTAssertEqual(store.localStorageOptions, [.recreateStoreOnModelMismatch]) XCTAssertEqual(store.localStorageOptions, [.recreateStoreOnModelMismatch])
@@ -144,12 +144,11 @@ final class StorageInterfaceTests: XCTestCase {
let systemDirectorySearchPath = FileManager.SearchPathDirectory.applicationSupportDirectory let systemDirectorySearchPath = FileManager.SearchPathDirectory.applicationSupportDirectory
#endif #endif
let legacyDefaultRootDirectory = FileManager.default.urlsForDirectory( let legacyDefaultRootDirectory = FileManager.default.urls(
systemDirectorySearchPath, for: systemDirectorySearchPath,
inDomains: .userDomainMask in: .userDomainMask).first!
).first!
let legacyDefaultFileURL = try! legacyDefaultRootDirectory let legacyDefaultFileURL = legacyDefaultRootDirectory
.appendingPathComponent(DataStack.applicationName, isDirectory: false) .appendingPathComponent(DataStack.applicationName, isDirectory: false)
.appendingPathExtension("sqlite") .appendingPathExtension("sqlite")
@@ -161,9 +160,9 @@ final class StorageInterfaceTests: XCTestCase {
dynamic func test_ThatDefaultLegacySQLiteStores_ConfigureCorrectly() { dynamic func test_ThatDefaultLegacySQLiteStores_ConfigureCorrectly() {
let store = LegacySQLiteStore() let store = LegacySQLiteStore()
XCTAssertEqual(store.dynamicType.storeType, NSSQLiteStoreType) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType)
XCTAssertNil(store.configuration) XCTAssertNil(store.configuration)
XCTAssertEqual(store.storeOptions, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary) XCTAssertEqual(store.storeOptions as NSDictionary?, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)
XCTAssertEqual(store.fileURL, LegacySQLiteStore.defaultFileURL) XCTAssertEqual(store.fileURL, LegacySQLiteStore.defaultFileURL)
XCTAssertEqual(store.mappingModelBundles, Bundle.allBundles) XCTAssertEqual(store.mappingModelBundles, Bundle.allBundles)
@@ -173,10 +172,10 @@ final class StorageInterfaceTests: XCTestCase {
@objc @objc
dynamic func test_ThatFileURLLegacySQLiteStores_ConfigureCorrectly() { dynamic func test_ThatFileURLLegacySQLiteStores_ConfigureCorrectly() {
let fileURL = try! URL(fileURLWithPath: NSTemporaryDirectory()) let fileURL = URL(fileURLWithPath: NSTemporaryDirectory())
.appendingPathComponent(UUID().uuidString, isDirectory: false) .appendingPathComponent(UUID().uuidString, isDirectory: false)
.appendingPathExtension("db") .appendingPathExtension("db")
let bundles = [Bundle(for: self.dynamicType)] let bundles = [Bundle(for: type(of: self))]
let store = LegacySQLiteStore( let store = LegacySQLiteStore(
fileURL: fileURL, fileURL: fileURL,
@@ -184,9 +183,9 @@ final class StorageInterfaceTests: XCTestCase {
mappingModelBundles: bundles, mappingModelBundles: bundles,
localStorageOptions: .recreateStoreOnModelMismatch localStorageOptions: .recreateStoreOnModelMismatch
) )
XCTAssertEqual(store.dynamicType.storeType, NSSQLiteStoreType) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType)
XCTAssertEqual(store.configuration, "config1") XCTAssertEqual(store.configuration, "config1")
XCTAssertEqual(store.storeOptions, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary) XCTAssertEqual(store.storeOptions as NSDictionary?, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)
XCTAssertEqual(store.fileURL, fileURL) XCTAssertEqual(store.fileURL, fileURL)
XCTAssertEqual(store.mappingModelBundles, bundles) XCTAssertEqual(store.mappingModelBundles, bundles)
@@ -197,7 +196,7 @@ final class StorageInterfaceTests: XCTestCase {
dynamic func test_ThatFileNameLegacySQLiteStores_ConfigureCorrectly() { dynamic func test_ThatFileNameLegacySQLiteStores_ConfigureCorrectly() {
let fileName = UUID().uuidString + ".db" let fileName = UUID().uuidString + ".db"
let bundles = [Bundle(for: self.dynamicType)] let bundles = [Bundle(for: type(of: self))]
let store = LegacySQLiteStore( let store = LegacySQLiteStore(
fileName: fileName, fileName: fileName,
@@ -205,11 +204,11 @@ final class StorageInterfaceTests: XCTestCase {
mappingModelBundles: bundles, mappingModelBundles: bundles,
localStorageOptions: .recreateStoreOnModelMismatch localStorageOptions: .recreateStoreOnModelMismatch
) )
XCTAssertEqual(store.dynamicType.storeType, NSSQLiteStoreType) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType)
XCTAssertEqual(store.configuration, "config1") XCTAssertEqual(store.configuration, "config1")
XCTAssertEqual(store.storeOptions, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary) XCTAssertEqual(store.storeOptions as NSDictionary?, [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)
XCTAssertEqual(try! store.fileURL.deletingLastPathComponent(), LegacySQLiteStore.defaultRootDirectory) XCTAssertEqual(store.fileURL.deletingLastPathComponent(), LegacySQLiteStore.defaultRootDirectory)
XCTAssertEqual(store.fileURL.lastPathComponent, fileName) XCTAssertEqual(store.fileURL.lastPathComponent, fileName)
XCTAssertEqual(store.mappingModelBundles, bundles) XCTAssertEqual(store.mappingModelBundles, bundles)
XCTAssertEqual(store.localStorageOptions, [.recreateStoreOnModelMismatch]) XCTAssertEqual(store.localStorageOptions, [.recreateStoreOnModelMismatch])
+20 -20
View File
@@ -41,7 +41,7 @@ final class TransactionTests: BaseTestCase {
let testDate = Date() let testDate = Date()
do { do {
let createExpectation = self.expectation(withDescription: "create") let createExpectation = self.expectation(description: "create")
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let object = transaction.create(Into<TestEntity1>()) let object = transaction.create(Into<TestEntity1>())
@@ -73,7 +73,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let updateExpectation = self.expectation(withDescription: "update") let updateExpectation = self.expectation(description: "update")
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
guard let object = transaction.fetchOne(From<TestEntity1>()) else { guard let object = transaction.fetchOne(From<TestEntity1>()) else {
@@ -108,7 +108,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let deleteExpectation = self.expectation(withDescription: "delete") let deleteExpectation = self.expectation(description: "delete")
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let object = transaction.fetchOne(From<TestEntity1>()) let object = transaction.fetchOne(From<TestEntity1>())
@@ -142,7 +142,7 @@ final class TransactionTests: BaseTestCase {
let testDate = Date() let testDate = Date()
do { do {
let createExpectation = self.expectation(withDescription: "create") let createExpectation = self.expectation(description: "create")
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let object = transaction.create(Into<TestEntity1>("Config1")) let object = transaction.create(Into<TestEntity1>("Config1"))
@@ -175,7 +175,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let updateExpectation = self.expectation(withDescription: "update") let updateExpectation = self.expectation(description: "update")
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
guard let object = transaction.fetchOne(From<TestEntity1>("Config1")) else { guard let object = transaction.fetchOne(From<TestEntity1>("Config1")) else {
@@ -211,7 +211,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let deleteExpectation = self.expectation(withDescription: "delete") let deleteExpectation = self.expectation(description: "delete")
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let object = transaction.fetchOne(From<TestEntity1>("Config1")) let object = transaction.fetchOne(From<TestEntity1>("Config1"))
@@ -242,7 +242,7 @@ final class TransactionTests: BaseTestCase {
do { do {
let createDiscardExpectation = self.expectation(withDescription: "create-discard") let createDiscardExpectation = self.expectation(description: "create-discard")
let loggerExpectations = self.prepareLoggerExpectations([.logWarning]) let loggerExpectations = self.prepareLoggerExpectations([.logWarning])
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
@@ -265,7 +265,7 @@ final class TransactionTests: BaseTestCase {
let testDate = Date() let testDate = Date()
do { do {
let createExpectation = self.expectation(withDescription: "create") let createExpectation = self.expectation(description: "create")
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
let object = transaction.create(Into<TestEntity1>()) let object = transaction.create(Into<TestEntity1>())
@@ -287,7 +287,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let updateDiscardExpectation = self.expectation(withDescription: "update-discard") let updateDiscardExpectation = self.expectation(description: "update-discard")
let loggerExpectations = self.prepareLoggerExpectations([.logWarning]) let loggerExpectations = self.prepareLoggerExpectations([.logWarning])
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
@@ -316,7 +316,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let deleteDiscardExpectation = self.expectation(withDescription: "delete-discard") let deleteDiscardExpectation = self.expectation(description: "delete-discard")
let loggerExpectations = self.prepareLoggerExpectations([.logWarning]) let loggerExpectations = self.prepareLoggerExpectations([.logWarning])
stack.beginSynchronous { (transaction) in stack.beginSynchronous { (transaction) in
@@ -352,7 +352,7 @@ final class TransactionTests: BaseTestCase {
let testDate = Date() let testDate = Date()
do { do {
let createExpectation = self.expectation(withDescription: "create") let createExpectation = self.expectation(description: "create")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
let object = transaction.create(Into<TestEntity1>()) let object = transaction.create(Into<TestEntity1>())
@@ -386,7 +386,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let updateExpectation = self.expectation(withDescription: "update") let updateExpectation = self.expectation(description: "update")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
guard let object = transaction.fetchOne(From<TestEntity1>()) else { guard let object = transaction.fetchOne(From<TestEntity1>()) else {
@@ -423,7 +423,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let deleteExpectation = self.expectation(withDescription: "delete") let deleteExpectation = self.expectation(description: "delete")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
let object = transaction.fetchOne(From<TestEntity1>()) let object = transaction.fetchOne(From<TestEntity1>())
@@ -460,7 +460,7 @@ final class TransactionTests: BaseTestCase {
let testDate = Date() let testDate = Date()
do { do {
let createExpectation = self.expectation(withDescription: "create") let createExpectation = self.expectation(description: "create")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
let object = transaction.create(Into<TestEntity1>("Config1")) let object = transaction.create(Into<TestEntity1>("Config1"))
@@ -495,7 +495,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let updateExpectation = self.expectation(withDescription: "update") let updateExpectation = self.expectation(description: "update")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
guard let object = transaction.fetchOne(From<TestEntity1>("Config1")) else { guard let object = transaction.fetchOne(From<TestEntity1>("Config1")) else {
@@ -533,7 +533,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let deleteExpectation = self.expectation(withDescription: "delete") let deleteExpectation = self.expectation(description: "delete")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
let object = transaction.fetchOne(From<TestEntity1>("Config1")) let object = transaction.fetchOne(From<TestEntity1>("Config1"))
@@ -568,7 +568,7 @@ final class TransactionTests: BaseTestCase {
do { do {
let createDiscardExpectation = self.expectation(withDescription: "create-discard") let createDiscardExpectation = self.expectation(description: "create-discard")
let loggerExpectations = self.prepareLoggerExpectations([.logWarning]) let loggerExpectations = self.prepareLoggerExpectations([.logWarning])
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
@@ -585,7 +585,7 @@ final class TransactionTests: BaseTestCase {
let testDate = Date() let testDate = Date()
do { do {
let createExpectation = self.expectation(withDescription: "create") let createExpectation = self.expectation(description: "create")
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
XCTAssertEqual(transaction.fetchCount(From<TestEntity1>()), 0) XCTAssertEqual(transaction.fetchCount(From<TestEntity1>()), 0)
@@ -612,7 +612,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let updateDiscardExpectation = self.expectation(withDescription: "update-discard") let updateDiscardExpectation = self.expectation(description: "update-discard")
let loggerExpectations = self.prepareLoggerExpectations([.logWarning]) let loggerExpectations = self.prepareLoggerExpectations([.logWarning])
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
@@ -631,7 +631,7 @@ final class TransactionTests: BaseTestCase {
} }
do { do {
let deleteDiscardExpectation = self.expectation(withDescription: "delete-discard") let deleteDiscardExpectation = self.expectation(description: "delete-discard")
let loggerExpectations = self.prepareLoggerExpectations([.logWarning]) let loggerExpectations = self.prepareLoggerExpectations([.logWarning])
stack.beginAsynchronous { (transaction) in stack.beginAsynchronous { (transaction) in
+1 -1
View File
@@ -36,7 +36,7 @@ final class TweakTests: XCTestCase {
@objc @objc
dynamic func test_ThatTweakClauses_ApplyToFetchRequestsCorrectly() { dynamic func test_ThatTweakClauses_ApplyToFetchRequestsCorrectly() {
let predicate = Predicate(format: "%K == %@", "key", "value") let predicate = NSPredicate(format: "%K == %@", "key", "value")
let tweak = Tweak { let tweak = Tweak {
$0.fetchOffset = 100 $0.fetchOffset = 100
+12 -12
View File
@@ -41,18 +41,18 @@ final class WhereTests: XCTestCase {
let whereClause = Where() let whereClause = Where()
XCTAssertEqual(whereClause, Where(true)) XCTAssertEqual(whereClause, Where(true))
XCTAssertNotEqual(whereClause, Where(false)) XCTAssertNotEqual(whereClause, Where(false))
XCTAssertEqual(whereClause.predicate, Predicate(value: true)) XCTAssertEqual(whereClause.predicate, NSPredicate(value: true))
} }
do { do {
let whereClause = Where(true) let whereClause = Where(true)
XCTAssertEqual(whereClause, Where()) XCTAssertEqual(whereClause, Where())
XCTAssertNotEqual(whereClause, Where(false)) XCTAssertNotEqual(whereClause, Where(false))
XCTAssertEqual(whereClause.predicate, Predicate(value: true)) XCTAssertEqual(whereClause.predicate, NSPredicate(value: true))
} }
do { do {
let predicate = Predicate(format: "%K == %@", "key", "value") let predicate = NSPredicate(format: "%K == %@", "key", "value")
let whereClause = Where(predicate) let whereClause = Where(predicate)
XCTAssertEqual(whereClause, Where(predicate)) XCTAssertEqual(whereClause, Where(predicate))
XCTAssertEqual(whereClause.predicate, predicate) XCTAssertEqual(whereClause.predicate, predicate)
@@ -60,28 +60,28 @@ final class WhereTests: XCTestCase {
do { do {
let whereClause = Where("%K == %@", "key", "value") let whereClause = Where("%K == %@", "key", "value")
let predicate = Predicate(format: "%K == %@", "key", "value") let predicate = NSPredicate(format: "%K == %@", "key", "value")
XCTAssertEqual(whereClause, Where(predicate)) XCTAssertEqual(whereClause, Where(predicate))
XCTAssertEqual(whereClause.predicate, predicate) XCTAssertEqual(whereClause.predicate, predicate)
} }
do { do {
let whereClause = Where("%K == %@", argumentArray: ["key", "value"]) let whereClause = Where("%K == %@", argumentArray: ["key", "value"])
let predicate = Predicate(format: "%K == %@", "key", "value") let predicate = NSPredicate(format: "%K == %@", "key", "value")
XCTAssertEqual(whereClause, Where(predicate)) XCTAssertEqual(whereClause, Where(predicate))
XCTAssertEqual(whereClause.predicate, predicate) XCTAssertEqual(whereClause.predicate, predicate)
} }
do { do {
let whereClause = Where("key", isEqualTo: "value") let whereClause = Where("key", isEqualTo: "value")
let predicate = Predicate(format: "%K == %@", "key", "value") let predicate = NSPredicate(format: "%K == %@", "key", "value")
XCTAssertEqual(whereClause, Where(predicate)) XCTAssertEqual(whereClause, Where(predicate))
XCTAssertEqual(whereClause.predicate, predicate) XCTAssertEqual(whereClause.predicate, predicate)
} }
do { do {
let whereClause = Where("key", isMemberOf: ["value1", "value2", "value3"]) let whereClause = Where("key", isMemberOf: ["value1", "value2", "value3"])
let predicate = Predicate(format: "%K IN %@", "key", ["value1", "value2", "value3"]) let predicate = NSPredicate(format: "%K IN %@", "key", ["value1", "value2", "value3"])
XCTAssertEqual(whereClause, Where(predicate)) XCTAssertEqual(whereClause, Where(predicate))
XCTAssertEqual(whereClause.predicate, predicate) XCTAssertEqual(whereClause.predicate, predicate)
} }
@@ -97,7 +97,7 @@ final class WhereTests: XCTestCase {
do { do {
let notWhere = !whereClause1 let notWhere = !whereClause1
let notPredicate = CompoundPredicate( let notPredicate = NSCompoundPredicate(
type: .not, type: .not,
subpredicates: [whereClause1.predicate] subpredicates: [whereClause1.predicate]
) )
@@ -107,10 +107,10 @@ final class WhereTests: XCTestCase {
do { do {
let andWhere = whereClause1 && whereClause2 && whereClause3 let andWhere = whereClause1 && whereClause2 && whereClause3
let andPredicate = CompoundPredicate( let andPredicate = NSCompoundPredicate(
type: .and, type: .and,
subpredicates: [ subpredicates: [
CompoundPredicate( NSCompoundPredicate(
type: .and, type: .and,
subpredicates: [whereClause1.predicate, whereClause2.predicate] subpredicates: [whereClause1.predicate, whereClause2.predicate]
), ),
@@ -123,10 +123,10 @@ final class WhereTests: XCTestCase {
do { do {
let orWhere = whereClause1 || whereClause2 || whereClause3 let orWhere = whereClause1 || whereClause2 || whereClause3
let orPredicate = CompoundPredicate( let orPredicate = NSCompoundPredicate(
type: .or, type: .or,
subpredicates: [ subpredicates: [
CompoundPredicate( NSCompoundPredicate(
type: .or, type: .or,
subpredicates: [whereClause1.predicate, whereClause2.predicate] subpredicates: [whereClause1.predicate, whereClause2.predicate]
), ),
-6
View File
@@ -41,11 +41,5 @@ targets = []
let package = Package( let package = Package(
name: "CoreStore", name: "CoreStore",
targets: targets, targets: targets,
dependencies: [
.Package(
url: "https://github.com/JohnEstropia/GCDKit.git",
"1.2.6"
)
],
exclude: ["Carthage", "CoreStoreDemo", "Sources/libA/images"] exclude: ["Carthage", "CoreStoreDemo", "Sources/libA/images"]
) )
+2 -5
View File
@@ -1084,7 +1084,7 @@ The `"count(friends)"` key name was automatically used by CoreStore, but you can
```swift ```swift
let personJSON = CoreStore.queryAttributes( let personJSON = CoreStore.queryAttributes(
From<MyPersonEntity>(), From<MyPersonEntity>(),
Select("name", .count("friends", As: "friendsCount")) Select("name", .count("friends", as: "friendsCount"))
) )
``` ```
which now returns: which now returns:
@@ -1107,7 +1107,7 @@ The `GroupBy` clause lets you group results by a specified attribute/aggregate.
```swift ```swift
let personJSON = CoreStore.queryAttributes( let personJSON = CoreStore.queryAttributes(
From<MyPersonEntity>(), From<MyPersonEntity>(),
Select("age", .count("age", As: "count")), Select("age", .count("age", as: "count")),
GroupBy("age") GroupBy("age")
) )
``` ```
@@ -1431,8 +1431,6 @@ to your target's `GCC_PREPROCESSOR_DEFINITIONS` build setting.
- Requires: - Requires:
- iOS 7 SDK and above - iOS 7 SDK and above
- Swift 2.2 (Xcode 7.3) - Swift 2.2 (Xcode 7.3)
- Dependencies:
- [GCDKit](https://github.com/JohnEstropia/GCDKit)
- Other notes: - Other notes:
- The `com.apple.CoreData.ConcurrencyDebug` debug argument should be turned off for the app. CoreStore already guarantees safety for you by making the main context read-only, and by only executing transactions serially. - The `com.apple.CoreData.ConcurrencyDebug` debug argument should be turned off for the app. CoreStore already guarantees safety for you by making the main context read-only, and by only executing transactions serially.
@@ -1446,7 +1444,6 @@ This installs CoreStore as a framework. Declare `import CoreStore` in your swift
In your `Cartfile`, add In your `Cartfile`, add
``` ```
github "JohnEstropia/CoreStore" >= 2.0.0 github "JohnEstropia/CoreStore" >= 2.0.0
github "JohnEstropia/GCDKit" >= 1.2.5
``` ```
and run and run
``` ```
@@ -38,10 +38,10 @@ public extension NSManagedObject {
- returns: the primitive value for the KVC key - returns: the primitive value for the KVC key
*/ */
@nonobjc @nonobjc
public func accessValueForKVCKey(_ KVCKey: KeyPath) -> AnyObject? { public func accessValueForKVCKey(_ KVCKey: KeyPath) -> Any? {
self.willAccessValue(forKey: KVCKey) self.willAccessValue(forKey: KVCKey)
let primitiveValue: AnyObject? = self.primitiveValue(forKey: KVCKey) let primitiveValue: Any? = self.primitiveValue(forKey: KVCKey)
self.didAccessValue(forKey: KVCKey) self.didAccessValue(forKey: KVCKey)
return primitiveValue return primitiveValue
@@ -54,7 +54,7 @@ public extension NSManagedObject {
- parameter KVCKey: the KVC key - parameter KVCKey: the KVC key
*/ */
@nonobjc @nonobjc
public func setValue(_ value: AnyObject?, forKVCKey KVCKey: KeyPath) { public func setValue(_ value: Any?, forKVCKey KVCKey: KeyPath) {
self.willChangeValue(forKey: KVCKey) self.willChangeValue(forKey: KVCKey)
self.setPrimitiveValue(value, forKey: KVCKey) self.setPrimitiveValue(value, forKey: KVCKey)
@@ -79,7 +79,8 @@ public extension Progress {
private final class ProgressObserver: NSObject { private final class ProgressObserver: NSObject {
private unowned let progress: Progress private unowned let progress: Progress
private var progressHandler: ((_ progress: Progress) -> Void)? {
fileprivate var progressHandler: ((_ progress: Progress) -> Void)? {
didSet { didSet {
@@ -105,7 +106,7 @@ private final class ProgressObserver: NSObject {
} }
} }
private init(_ progress: Progress) { fileprivate init(_ progress: Progress) {
self.progress = progress self.progress = progress
super.init() super.init()
@@ -120,7 +121,7 @@ private final class ProgressObserver: NSObject {
} }
} }
override func observeValue(forKeyPath keyPath: String?, of object: AnyObject?, change: [NSKeyValueChangeKey : AnyObject]?, context: UnsafeMutablePointer<Void>?) { override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let progress = object as? Progress, guard let progress = object as? Progress,
progress == self.progress, progress == self.progress,
@@ -131,7 +132,7 @@ private final class ProgressObserver: NSObject {
DispatchQueue.main.async { [weak self] () -> Void in DispatchQueue.main.async { [weak self] () -> Void in
self?.progressHandler?(progress: progress) self?.progressHandler?(progress)
} }
} }
} }
@@ -316,7 +316,7 @@ public extension BaseDataTransaction {
- parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. - parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses.
- returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter.
*/ */
public func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[NSString: AnyObject]]? { public func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[String: Any]]? {
CoreStore.assert( CoreStore.assert(
self.isRunningInAllowedQueue(), self.isRunningInAllowedQueue(),
@@ -336,7 +336,7 @@ public extension BaseDataTransaction {
- parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. - parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses.
- returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter.
*/ */
public func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: [QueryClause]) -> [[NSString: AnyObject]]? { public func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: [QueryClause]) -> [[String: Any]]? {
CoreStore.assert( CoreStore.assert(
self.isRunningInAllowedQueue(), self.isRunningInAllowedQueue(),
@@ -115,10 +115,10 @@ public struct OrderBy: FetchClause, QueryClause, DeleteClause, Hashable {
switch sortKey { switch sortKey {
case .ascending(let keyPath): case .ascending(let keyPath):
return SortDescriptor(key: keyPath, ascending: true) return NSSortDescriptor(key: keyPath, ascending: true)
case .descending(let keyPath): case .descending(let keyPath):
return SortDescriptor(key: keyPath, ascending: false) return NSSortDescriptor(key: keyPath, ascending: false)
} }
} }
) )
@@ -44,7 +44,7 @@ public protocol SelectValueResultType: SelectResultType {
static var attributeType: NSAttributeType { get } static var attributeType: NSAttributeType { get }
static func fromResultObject(_ result: AnyObject) -> Self? static func fromResultObject(_ result: Any) -> Self?
} }
@@ -55,7 +55,7 @@ public protocol SelectValueResultType: SelectResultType {
*/ */
public protocol SelectAttributesResultType: SelectResultType { public protocol SelectAttributesResultType: SelectResultType {
static func fromResultObjects(_ result: [AnyObject]) -> [[NSString: AnyObject]] static func fromResultObjects(_ result: [Any]) -> [[String: Any]]
} }
@@ -103,7 +103,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "average(<attributeName>)" is used - parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "average(<attributeName>)" is used
- returns: a `SelectTerm` to a `Select` clause for querying the average value of an attribute - returns: a `SelectTerm` to a `Select` clause for querying the average value of an attribute
*/ */
public static func average(_ keyPath: KeyPath, As alias: KeyPath? = nil) -> SelectTerm { public static func average(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
return ._aggregate( return ._aggregate(
function: "average:", function: "average:",
@@ -125,7 +125,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "count(<attributeName>)" is used - parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "count(<attributeName>)" is used
- returns: a `SelectTerm` to a `Select` clause for a count query - returns: a `SelectTerm` to a `Select` clause for a count query
*/ */
public static func count(_ keyPath: KeyPath, As alias: KeyPath? = nil) -> SelectTerm { public static func count(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
return ._aggregate( return ._aggregate(
function: "count:", function: "count:",
@@ -147,7 +147,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "max(<attributeName>)" is used - parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "max(<attributeName>)" is used
- returns: a `SelectTerm` to a `Select` clause for querying the maximum value for an attribute - returns: a `SelectTerm` to a `Select` clause for querying the maximum value for an attribute
*/ */
public static func maximum(_ keyPath: KeyPath, As alias: KeyPath? = nil) -> SelectTerm { public static func maximum(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
return ._aggregate( return ._aggregate(
function: "max:", function: "max:",
@@ -169,7 +169,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "min(<attributeName>)" is used - parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "min(<attributeName>)" is used
- returns: a `SelectTerm` to a `Select` clause for querying the minimum value for an attribute - returns: a `SelectTerm` to a `Select` clause for querying the minimum value for an attribute
*/ */
public static func minimum(_ keyPath: KeyPath, As alias: KeyPath? = nil) -> SelectTerm { public static func minimum(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
return ._aggregate( return ._aggregate(
function: "min:", function: "min:",
@@ -191,7 +191,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "sum(<attributeName>)" is used - parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "sum(<attributeName>)" is used
- returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute - returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute
*/ */
public static func sum(_ keyPath: KeyPath, As alias: KeyPath? = nil) -> SelectTerm { public static func sum(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
return ._aggregate( return ._aggregate(
function: "sum:", function: "sum:",
@@ -214,7 +214,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "objecID" is used - parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "objecID" is used
- returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute - returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute
*/ */
public static func objectID(As alias: KeyPath? = nil) -> SelectTerm { public static func objectID(as alias: KeyPath? = nil) -> SelectTerm {
return ._identity( return ._identity(
alias: alias ?? "objectID", alias: alias ?? "objectID",
@@ -402,7 +402,7 @@ extension Bool: SelectValueResultType {
return .booleanAttributeType return .booleanAttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Bool? { public static func fromResultObject(_ result: Any) -> Bool? {
switch result { switch result {
case let decimal as NSDecimalNumber: case let decimal as NSDecimalNumber:
@@ -429,7 +429,7 @@ extension Int8: SelectValueResultType {
return .integer64AttributeType return .integer64AttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Int8? { public static func fromResultObject(_ result: Any) -> Int8? {
guard let value = (result as? NSNumber)?.int64Value else { guard let value = (result as? NSNumber)?.int64Value else {
@@ -449,7 +449,7 @@ extension Int16: SelectValueResultType {
return .integer64AttributeType return .integer64AttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Int16? { public static func fromResultObject(_ result: Any) -> Int16? {
guard let value = (result as? NSNumber)?.int64Value else { guard let value = (result as? NSNumber)?.int64Value else {
@@ -469,7 +469,7 @@ extension Int32: SelectValueResultType {
return .integer64AttributeType return .integer64AttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Int32? { public static func fromResultObject(_ result: Any) -> Int32? {
guard let value = (result as? NSNumber)?.int64Value else { guard let value = (result as? NSNumber)?.int64Value else {
@@ -489,7 +489,7 @@ extension Int64: SelectValueResultType {
return .integer64AttributeType return .integer64AttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Int64? { public static func fromResultObject(_ result: Any) -> Int64? {
return (result as? NSNumber)?.int64Value return (result as? NSNumber)?.int64Value
} }
@@ -505,7 +505,7 @@ extension Int: SelectValueResultType {
return .integer64AttributeType return .integer64AttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Int? { public static func fromResultObject(_ result: Any) -> Int? {
guard let value = (result as? NSNumber)?.int64Value else { guard let value = (result as? NSNumber)?.int64Value else {
@@ -525,7 +525,7 @@ extension Double: SelectValueResultType {
return .doubleAttributeType return .doubleAttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Double? { public static func fromResultObject(_ result: Any) -> Double? {
return (result as? NSNumber)?.doubleValue return (result as? NSNumber)?.doubleValue
} }
@@ -541,7 +541,7 @@ extension Float: SelectValueResultType {
return .floatAttributeType return .floatAttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Float? { public static func fromResultObject(_ result: Any) -> Float? {
return (result as? NSNumber)?.floatValue return (result as? NSNumber)?.floatValue
} }
@@ -557,7 +557,7 @@ extension String: SelectValueResultType {
return .stringAttributeType return .stringAttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> String? { public static func fromResultObject(_ result: Any) -> String? {
return result as? String return result as? String
} }
@@ -573,7 +573,7 @@ extension Date: SelectValueResultType {
return .dateAttributeType return .dateAttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Date? { public static func fromResultObject(_ result: Any) -> Date? {
return result as? Date return result as? Date
} }
@@ -589,7 +589,7 @@ extension Data: SelectValueResultType {
return .binaryDataAttributeType return .binaryDataAttributeType
} }
public static func fromResultObject(_ result: AnyObject) -> Data? { public static func fromResultObject(_ result: Any) -> Data? {
return result as? Data return result as? Data
} }
@@ -605,9 +605,9 @@ extension NSNumber: SelectValueResultType {
return .integer64AttributeType return .integer64AttributeType
} }
public class func fromResultObject(_ result: AnyObject) -> Self? { public class func fromResultObject(_ result: Any) -> Self? {
func forceCast<T: NSNumber>(_ object: AnyObject) -> T? { func forceCast<T: NSNumber>(_ object: Any) -> T? {
return (object as? T) return (object as? T)
} }
@@ -625,9 +625,9 @@ extension NSString: SelectValueResultType {
return .stringAttributeType return .stringAttributeType
} }
public class func fromResultObject(_ result: AnyObject) -> Self? { public class func fromResultObject(_ result: Any) -> Self? {
func forceCast<T: NSString>(_ object: AnyObject) -> T? { func forceCast<T: NSString>(_ object: Any) -> T? {
return (object as? T) return (object as? T)
} }
@@ -645,9 +645,9 @@ extension NSDecimalNumber {
return .decimalAttributeType return .decimalAttributeType
} }
public override class func fromResultObject(_ result: AnyObject) -> Self? { public override class func fromResultObject(_ result: Any) -> Self? {
func forceCast<T: NSDecimalNumber>(_ object: AnyObject) -> T? { func forceCast<T: NSDecimalNumber>(_ object: Any) -> T? {
return (object as? T) return (object as? T)
} }
@@ -665,9 +665,9 @@ extension NSDate: SelectValueResultType {
return .dateAttributeType return .dateAttributeType
} }
public class func fromResultObject(_ result: AnyObject) -> Self? { public class func fromResultObject(_ result: Any) -> Self? {
func forceCast<T: NSDate>(_ object: AnyObject) -> T? { func forceCast<T: NSDate>(_ object: Any) -> T? {
return (object as? T) return (object as? T)
} }
@@ -685,9 +685,9 @@ extension NSData: SelectValueResultType {
return .binaryDataAttributeType return .binaryDataAttributeType
} }
public class func fromResultObject(_ result: AnyObject) -> Self? { public class func fromResultObject(_ result: Any) -> Self? {
func forceCast<T: NSData>(_ object: AnyObject) -> T? { func forceCast<T: NSData>(_ object: Any) -> T? {
return (object as? T) return (object as? T)
} }
@@ -705,9 +705,9 @@ extension NSManagedObjectID: SelectValueResultType {
return .objectIDAttributeType return .objectIDAttributeType
} }
public class func fromResultObject(_ result: AnyObject) -> Self? { public class func fromResultObject(_ result: Any) -> Self? {
func forceCast<T: NSManagedObjectID>(_ object: AnyObject) -> T? { func forceCast<T: NSManagedObjectID>(_ object: Any) -> T? {
return (object as? T) return (object as? T)
} }
@@ -722,9 +722,9 @@ extension NSDictionary: SelectAttributesResultType {
// MARK: SelectAttributesResultType // MARK: SelectAttributesResultType
public class func fromResultObjects(_ result: [AnyObject]) -> [[NSString: AnyObject]] { public class func fromResultObjects(_ result: [Any]) -> [[String: Any]] {
return result as! [[NSString: AnyObject]] return result as! [[String: Any]]
} }
} }
@@ -761,7 +761,7 @@ internal extension Collection where Iterator.Element == SelectTerm {
} }
} }
var propertiesToFetch = [AnyObject]() var propertiesToFetch = [Any]()
for term in self { for term in self {
switch term { switch term {
@@ -79,7 +79,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
- parameter format: the format string for the predicate - parameter format: the format string for the predicate
- parameter args: the arguments for `format` - parameter args: the arguments for `format`
*/ */
public init(_ format: String, _ args: NSObject...) { public init(_ format: String, _ args: Any...) {
self.init(NSPredicate(format: format, argumentArray: args)) self.init(NSPredicate(format: format, argumentArray: args))
} }
@@ -90,7 +90,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
- parameter format: the format string for the predicate - parameter format: the format string for the predicate
- parameter argumentArray: the arguments for `format` - parameter argumentArray: the arguments for `format`
*/ */
public init(_ format: String, argumentArray: [NSObject]?) { public init(_ format: String, argumentArray: [Any]?) {
self.init(NSPredicate(format: format, argumentArray: argumentArray)) self.init(NSPredicate(format: format, argumentArray: argumentArray))
} }
@@ -101,7 +101,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
- parameter keyPath: the keyPath to compare with - parameter keyPath: the keyPath to compare with
- parameter value: the arguments for the `==` operator - parameter value: the arguments for the `==` operator
*/ */
public init(_ keyPath: KeyPath, isEqualTo value: NSObject?) { public init(_ keyPath: KeyPath, isEqualTo value: Any?) {
self.init(value == nil self.init(value == nil
? NSPredicate(format: "\(keyPath) == nil") ? NSPredicate(format: "\(keyPath) == nil")
@@ -114,7 +114,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
- parameter keyPath: the keyPath to compare with - parameter keyPath: the keyPath to compare with
- parameter list: the array to check membership of - parameter list: the array to check membership of
*/ */
public init(_ keyPath: KeyPath, isMemberOf list: [NSObject]) { public init(_ keyPath: KeyPath, isMemberOf list: [Any]) {
self.init(NSPredicate(format: "\(keyPath) IN %@", list)) self.init(NSPredicate(format: "\(keyPath) IN %@", list))
} }
@@ -125,7 +125,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
- parameter keyPath: the keyPath to compare with - parameter keyPath: the keyPath to compare with
- parameter list: the sequence to check membership of - parameter list: the sequence to check membership of
*/ */
public init<S: Sequence>(_ keyPath: KeyPath, isMemberOf list: S) where S.Iterator.Element: NSObject { public init<S: Sequence>(_ keyPath: KeyPath, isMemberOf list: S) where S.Iterator.Element: Any {
self.init(NSPredicate(format: "\(keyPath) IN %@", Array(list) as NSArray)) self.init(NSPredicate(format: "\(keyPath) IN %@", Array(list) as NSArray))
} }
@@ -235,7 +235,7 @@ public extension CoreStore {
- parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. - parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses.
- returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter.
*/ */
public static func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[NSString: AnyObject]]? { public static func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[String: Any]]? {
return self.defaultStack.queryAttributes(from, selectClause, queryClauses) return self.defaultStack.queryAttributes(from, selectClause, queryClauses)
} }
@@ -250,7 +250,7 @@ public extension CoreStore {
- parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. - parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses.
- returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter.
*/ */
public static func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: [QueryClause]) -> [[NSString: AnyObject]]? { public static func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: [QueryClause]) -> [[String: Any]]? {
return self.defaultStack.queryAttributes(from, selectClause, queryClauses) return self.defaultStack.queryAttributes(from, selectClause, queryClauses)
} }
@@ -297,7 +297,7 @@ public extension DataStack {
- parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. - parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses.
- returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter.
*/ */
public func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[NSString: AnyObject]]? { public func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[String: Any]]? {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
@@ -316,7 +316,7 @@ public extension DataStack {
- parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. - parameter queryClauses: a series of `QueryClause` instances for the query request. Accepts `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses.
- returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `Select<U>` parameter.
*/ */
public func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: [QueryClause]) -> [[NSString: AnyObject]]? { public func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: [QueryClause]) -> [[String: Any]]? {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
@@ -36,7 +36,7 @@ internal final class CoreStoreFetchedResultsController: NSFetchedResultsControll
// MARK: Internal // MARK: Internal
@nonobjc @nonobjc
internal convenience init<T: NSManagedObject>(dataStack: DataStack, fetchRequest: NSFetchRequest<NSManagedObject>, from: From<T>? = nil, sectionBy: SectionBy? = nil, applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void) { internal convenience init<T: NSManagedObject>(dataStack: DataStack, fetchRequest: NSFetchRequest<NSManagedObject>, from: From<T>? = nil, sectionBy: SectionBy? = nil, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void) {
self.init( self.init(
context: dataStack.mainContext, context: dataStack.mainContext,
@@ -48,7 +48,7 @@ internal final class CoreStoreFetchedResultsController: NSFetchedResultsControll
} }
@nonobjc @nonobjc
internal init<T: NSManagedObject>(context: NSManagedObjectContext, fetchRequest: NSFetchRequest<NSManagedObject>, from: From<T>? = nil, sectionBy: SectionBy? = nil, applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void) { internal init<T: NSManagedObject>(context: NSManagedObjectContext, fetchRequest: NSFetchRequest<NSManagedObject>, from: From<T>? = nil, sectionBy: SectionBy? = nil, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void) {
_ = from?.applyToFetchRequest( _ = from?.applyToFetchRequest(
fetchRequest, fetchRequest,
@@ -30,22 +30,22 @@ import Foundation
internal extension DispatchQueue { internal extension DispatchQueue {
internal convenience init(serialWith label: String) { internal convenience init(serialWith label: String, qos: DispatchQoS = .default) {
self.init( self.init(
label: label, label: label,
qos: .default, qos: qos,
attributes: .allZeros, attributes: [],
autoreleaseFrequency: .inherit, autoreleaseFrequency: .inherit,
target: nil target: nil
) )
} }
internal convenience init(concurrentWith label: String) { internal convenience init(concurrentWith label: String, qos: DispatchQoS = .default) {
self.init( self.init(
label: label, label: label,
qos: .default, qos: qos,
attributes: .concurrent, attributes: .concurrent,
autoreleaseFrequency: .inherit, autoreleaseFrequency: .inherit,
target: nil target: nil
@@ -62,20 +62,20 @@ internal extension DispatchQueue {
internal func cs_sync<T>(_ closure: () throws -> T) rethrows -> T { internal func cs_sync<T>(_ closure: () throws -> T) rethrows -> T {
return self.sync { autoreleasepool(invoking: closure) } return try self.sync { try autoreleasepool(invoking: closure) }
} }
internal func cs_async(_ closure: () -> Void) { internal func cs_async(_ closure: @escaping () -> Void) {
self.async { autoreleasepool(invoking: closure) } self.async { autoreleasepool(invoking: closure) }
} }
internal func cs_barrierSync<T>(_ closure: () throws -> T) rethrows -> T { internal func cs_barrierSync<T>(_ closure: () throws -> T) rethrows -> T {
return self.sync(flags: .barrier) { autoreleasepool(invoking: closure) } return try self.sync(flags: .barrier) { try autoreleasepool(invoking: closure) }
} }
internal func cs_barrierAsync(_ closure: () -> Void) { internal func cs_barrierAsync(_ closure: @escaping () -> Void) {
self.async(flags: .barrier) { autoreleasepool(invoking: closure) } self.async(flags: .barrier) { autoreleasepool(invoking: closure) }
} }
@@ -33,7 +33,7 @@ import CoreData
internal protocol FetchedResultsControllerHandler: class { internal protocol FetchedResultsControllerHandler: class {
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeObject anObject: AnyObject, atIndexPath indexPath: IndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeObject anObject: Any, atIndexPath indexPath: IndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: IndexPath?)
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType)
@@ -101,7 +101,7 @@ internal final class FetchedResultsControllerDelegate<EntityType: NSManagedObjec
} }
@objc @objc
dynamic func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: AnyObject, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { dynamic func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
guard self.enabled else { guard self.enabled else {
+4 -4
View File
@@ -27,7 +27,7 @@ import Foundation
// MARK: Associated Objects // MARK: Associated Objects
internal func cs_getAssociatedObjectForKey<T: AnyObject>(_ key: UnsafeRawPointer, inObject object: AnyObject) -> T? { internal func cs_getAssociatedObjectForKey<T: AnyObject>(_ key: UnsafeRawPointer, inObject object: Any) -> T? {
switch objc_getAssociatedObject(object, key) { switch objc_getAssociatedObject(object, key) {
@@ -42,17 +42,17 @@ internal func cs_getAssociatedObjectForKey<T: AnyObject>(_ key: UnsafeRawPointer
} }
} }
internal func cs_setAssociatedRetainedObject<T: AnyObject>(_ associatedObject: T?, forKey key: UnsafeRawPointer, inObject object: AnyObject) { internal func cs_setAssociatedRetainedObject<T: AnyObject>(_ associatedObject: T?, forKey key: UnsafeRawPointer, inObject object: Any) {
objc_setAssociatedObject(object, key, associatedObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) objc_setAssociatedObject(object, key, associatedObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
} }
internal func cs_setAssociatedCopiedObject<T: AnyObject>(_ associatedObject: T?, forKey key: UnsafeRawPointer, inObject object: AnyObject) { internal func cs_setAssociatedCopiedObject<T: AnyObject>(_ associatedObject: T?, forKey key: UnsafeRawPointer, inObject object: Any) {
objc_setAssociatedObject(object, key, associatedObject, .OBJC_ASSOCIATION_COPY_NONATOMIC) objc_setAssociatedObject(object, key, associatedObject, .OBJC_ASSOCIATION_COPY_NONATOMIC)
} }
internal func cs_setAssociatedWeakObject<T: AnyObject>(_ associatedObject: T?, forKey key: UnsafeRawPointer, inObject object: AnyObject) { internal func cs_setAssociatedWeakObject<T: AnyObject>(_ associatedObject: T?, forKey key: UnsafeRawPointer, inObject object: Any) {
if let associatedObject = associatedObject { if let associatedObject = associatedObject {
@@ -425,7 +425,7 @@ internal extension NSManagedObjectContext {
@nonobjc @nonobjc
internal func queryValue<U: SelectValueResultType>(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> U? { internal func queryValue<U: SelectValueResultType>(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> U? {
var fetchResults: [AnyObject]? var fetchResults: [Any]?
var fetchError: Error? var fetchError: Error?
self.performAndWait { self.performAndWait {
@@ -441,7 +441,7 @@ internal extension NSManagedObjectContext {
if let fetchResults = fetchResults { if let fetchResults = fetchResults {
if let rawResult = fetchResults.first as? NSDictionary, if let rawResult = fetchResults.first as? NSDictionary,
let rawObject: AnyObject = rawResult[selectTerms.keyPathForFirstSelectTerm()] { let rawObject = rawResult[selectTerms.keyPathForFirstSelectTerm()] {
return Select<U>.ReturnType.fromResultObject(rawObject) return Select<U>.ReturnType.fromResultObject(rawObject)
} }
@@ -456,9 +456,9 @@ internal extension NSManagedObjectContext {
} }
@nonobjc @nonobjc
internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> AnyObject? { internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> Any? {
var fetchResults: [AnyObject]? var fetchResults: [Any]?
var fetchError: Error? var fetchError: Error?
self.performAndWait { self.performAndWait {
@@ -474,7 +474,7 @@ internal extension NSManagedObjectContext {
if let fetchResults = fetchResults { if let fetchResults = fetchResults {
if let rawResult = fetchResults.first as? NSDictionary, if let rawResult = fetchResults.first as? NSDictionary,
let rawObject: AnyObject = rawResult[selectTerms.keyPathForFirstSelectTerm()] { let rawObject = rawResult[selectTerms.keyPathForFirstSelectTerm()] {
return rawObject return rawObject
} }
@@ -492,13 +492,13 @@ internal extension NSManagedObjectContext {
// MARK: Internal: Attributes // MARK: Internal: Attributes
@nonobjc @nonobjc
internal func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[NSString: AnyObject]]? { internal func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[String: Any]]? {
return self.queryAttributes(from, selectClause, queryClauses) return self.queryAttributes(from, selectClause, queryClauses)
} }
@nonobjc @nonobjc
internal func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: [QueryClause]) -> [[NSString: AnyObject]]? { internal func queryAttributes<T: NSManagedObject>(_ from: From<T>, _ selectClause: Select<NSDictionary>, _ queryClauses: [QueryClause]) -> [[String: Any]]? {
let fetchRequest = CoreStoreFetchRequest<NSFetchRequestResult>() let fetchRequest = CoreStoreFetchRequest<NSFetchRequestResult>()
let storeFound = from.applyToFetchRequest(fetchRequest, context: self) let storeFound = from.applyToFetchRequest(fetchRequest, context: self)
@@ -516,9 +516,9 @@ internal extension NSManagedObjectContext {
} }
@nonobjc @nonobjc
internal func queryAttributes(_ fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> [[NSString: AnyObject]]? { internal func queryAttributes(_ fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> [[String: Any]]? {
var fetchResults: [AnyObject]? var fetchResults: [Any]?
var fetchError: Error? var fetchError: Error?
self.performAndWait { self.performAndWait {
@@ -155,7 +155,7 @@ internal extension NSManagedObjectContext {
DispatchQueue.main.async { DispatchQueue.main.async {
completion(result: SaveResult(hasChanges: false)) completion(SaveResult(hasChanges: false))
} }
return return
} }
@@ -175,7 +175,7 @@ internal extension NSManagedObjectContext {
) )
DispatchQueue.main.async { DispatchQueue.main.async {
completion(result: SaveResult(saveError)) completion(SaveResult(saveError))
} }
return return
} }
@@ -188,7 +188,7 @@ internal extension NSManagedObjectContext {
DispatchQueue.main.async { DispatchQueue.main.async {
completion(result: SaveResult(hasChanges: true)) completion(SaveResult(hasChanges: true))
} }
} }
} }
@@ -42,7 +42,7 @@ internal extension NSManagedObjectModel {
} }
let modelFileURL = URL(fileURLWithPath: modelFilePath) let modelFileURL = URL(fileURLWithPath: modelFilePath)
let versionInfoPlistURL = try! modelFileURL.appendingPathComponent("VersionInfo.plist", isDirectory: false) let versionInfoPlistURL = modelFileURL.appendingPathComponent("VersionInfo.plist", isDirectory: false)
guard let versionInfo = NSDictionary(contentsOf: versionInfoPlistURL), guard let versionInfo = NSDictionary(contentsOf: versionInfoPlistURL),
let versionHashes = versionInfo["NSManagedObjectModel_VersionHashes"] as? [String: AnyObject] else { let versionHashes = versionInfo["NSManagedObjectModel_VersionHashes"] as? [String: AnyObject] else {
@@ -84,7 +84,7 @@ internal extension NSManagedObjectModel {
var modelVersionFileURL: URL? var modelVersionFileURL: URL?
for modelVersion in modelVersions { for modelVersion in modelVersions {
let fileURL = try! modelFileURL.appendingPathComponent("\(modelVersion).mom", isDirectory: false) let fileURL = modelFileURL.appendingPathComponent("\(modelVersion).mom", isDirectory: false)
if modelVersion == currentModelVersion { if modelVersion == currentModelVersion {
@@ -190,7 +190,7 @@ internal extension NSManagedObjectModel {
return nil return nil
} }
let versionModelFileURL = try! modelFileURL.appendingPathComponent("\(modelVersion).mom", isDirectory: false) let versionModelFileURL = modelFileURL.appendingPathComponent("\(modelVersion).mom", isDirectory: false)
guard let model = NSManagedObjectModel(contentsOf: versionModelFileURL) else { guard let model = NSManagedObjectModel(contentsOf: versionModelFileURL) else {
return nil return nil
@@ -203,7 +203,7 @@ internal extension NSManagedObjectModel {
} }
@nonobjc @nonobjc
internal subscript(metadata: [String: AnyObject]) -> NSManagedObjectModel? { internal subscript(metadata: [String: Any]) -> NSManagedObjectModel? {
guard let modelHashes = metadata[NSStoreModelVersionHashesKey] as? [String : Data] else { guard let modelHashes = metadata[NSStoreModelVersionHashesKey] as? [String : Data] else {
@@ -227,7 +227,7 @@ internal extension NSManagedObjectModel {
get { get {
return try! self.modelVersionFileURL?.deletingLastPathComponent() return self.modelVersionFileURL?.deletingLastPathComponent()
} }
} }
@@ -66,15 +66,15 @@ internal extension NSPersistentStore {
// MARK: - StorageObject // MARK: - StorageObject
private class StorageObject: NSObject { fileprivate class StorageObject: NSObject {
// MARK: Private // MARK: Private
@nonobjc @nonobjc
private let storageInterface: StorageInterface? fileprivate let storageInterface: StorageInterface?
@nonobjc @nonobjc
private init(_ storage: StorageInterface?) { fileprivate init(_ storage: StorageInterface?) {
self.storageInterface = storage self.storageInterface = storage
} }
@@ -934,14 +934,14 @@ private func createFormattedString(_ firstLine: String, _ lastLine: String, _ in
return string return string
} }
private extension String { fileprivate extension String {
private static func indention(_ level: Int = 1) -> String { fileprivate static func indention(_ level: Int = 1) -> String {
return String(repeating: Character(" "), count: level * 4) return String(repeating: " ", count: level * 4)
} }
private func trimSwiftModuleName() -> String { fileprivate func trimSwiftModuleName() -> String {
if self.hasPrefix("Swift.") { if self.hasPrefix("Swift.") {
@@ -950,12 +950,12 @@ private extension String {
return self return self
} }
private mutating func indent(_ level: Int) { fileprivate mutating func indent(_ level: Int) {
self = self.replacingOccurrences(of: "\n", with: "\n\(String.indention(level))") self = self.replacingOccurrences(of: "\n", with: "\n\(String.indention(level))")
} }
private mutating func appendDumpInfo(_ key: String, _ value: Any) { fileprivate mutating func appendDumpInfo(_ key: String, _ value: Any) {
self.append("\n.\(key) = \(formattedValue(value));") self.append("\n.\(key) = \(formattedValue(value));")
} }
@@ -1071,7 +1071,7 @@ extension Bundle: CoreStoreDebugStringConvertible {
public var coreStoreDumpString: String { public var coreStoreDumpString: String {
return "\(self.bundleIdentifier.flatMap({ "\"\($0)\"" }) ?? "<unknown bundle identifier>") (\(self.bundleURL.lastPathComponent ?? "<unknown bundle URL>"))" return "\(self.bundleIdentifier.flatMap({ "\"\($0)\"" }) ?? "<unknown bundle identifier>") (\(self.bundleURL.lastPathComponent))"
} }
} }
+4 -4
View File
@@ -70,7 +70,7 @@ public final class DefaultLogger: CoreStoreLogger {
icon = "" icon = ""
levelString = "Fatal" levelString = "Fatal"
} }
Swift.print("\(icon) [CoreStore: \(levelString)] \((String(fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message)\n") Swift.print("\(icon) [CoreStore: \(levelString)] \((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message)\n")
#endif #endif
} }
@@ -86,7 +86,7 @@ public final class DefaultLogger: CoreStoreLogger {
public func log(error: CoreStoreError, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) { public func log(error: CoreStoreError, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) {
#if DEBUG #if DEBUG
Swift.print("⚠️ [CoreStore: Error] \((String(fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message)\n \(error)\n") Swift.print("⚠️ [CoreStore: Error] \((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message)\n \(error)\n")
#endif #endif
} }
@@ -106,7 +106,7 @@ public final class DefaultLogger: CoreStoreLogger {
return return
} }
Swift.print("❗ [CoreStore: Assertion Failure] \((String(fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message())\n") Swift.print("❗ [CoreStore: Assertion Failure] \((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message())\n")
Swift.fatalError(file: fileName, line: UInt(lineNumber)) Swift.fatalError(file: fileName, line: UInt(lineNumber))
#endif #endif
} }
@@ -122,7 +122,7 @@ public final class DefaultLogger: CoreStoreLogger {
*/ */
public func abort(_ message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) { public func abort(_ message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) {
Swift.print("❗ [CoreStore: Fatal Error] \((String(fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message)\n") Swift.print("❗ [CoreStore: Fatal Error] \((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message)\n")
Swift.fatalError(file: fileName, line: UInt(lineNumber)) Swift.fatalError(file: fileName, line: UInt(lineNumber))
} }
} }
+6 -6
View File
@@ -47,7 +47,7 @@ public extension CoreStore {
- parameter storeType: the storage type - parameter storeType: the storage type
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `StorageInterface` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `StorageInterface` was already added at the same URL and with the same configuration. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `StorageInterface` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `StorageInterface` was already added at the same URL and with the same configuration.
*/ */
public static func addStorage<T: StorageInterface>(_ storeType: T.Type, completion: (SetupResult<T>) -> Void) where T: DefaultInitializableStore { public static func addStorage<T: StorageInterface>(_ storeType: T.Type, completion: @escaping (SetupResult<T>) -> Void) where T: DefaultInitializableStore {
self.defaultStack.addStorage(storeType.init(), completion: completion) self.defaultStack.addStorage(storeType.init(), completion: completion)
} }
@@ -68,7 +68,7 @@ public extension CoreStore {
- parameter storage: the storage - parameter storage: the storage
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `StorageInterface` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `StorageInterface` was already added at the same URL and with the same configuration. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `StorageInterface` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `StorageInterface` was already added at the same URL and with the same configuration.
*/ */
public static func addStorage<T: StorageInterface>(_ storage: T, completion: (SetupResult<T>) -> Void) { public static func addStorage<T: StorageInterface>(_ storage: T, completion: @escaping (SetupResult<T>) -> Void) {
self.defaultStack.addStorage(storage, completion: completion) self.defaultStack.addStorage(storage, completion: completion)
} }
@@ -90,7 +90,7 @@ public extension CoreStore {
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `LocalStorage` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `LocalStorage` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration.
- returns: an `NSProgress` instance if a migration has started, or `nil` if either no migrations are required or if a failure occured. - returns: an `NSProgress` instance if a migration has started, or `nil` if either no migrations are required or if a failure occured.
*/ */
public static func addStorage<T: LocalStorage>(_ storeType: T.Type, completion: (SetupResult<T>) -> Void) -> Progress? where T: DefaultInitializableStore { public static func addStorage<T: LocalStorage>(_ storeType: T.Type, completion: @escaping (SetupResult<T>) -> Void) -> Progress? where T: DefaultInitializableStore {
return self.defaultStack.addStorage(storeType.init(), completion: completion) return self.defaultStack.addStorage(storeType.init(), completion: completion)
} }
@@ -112,7 +112,7 @@ public extension CoreStore {
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `LocalStorage` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `LocalStorage` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration.
- returns: an `NSProgress` instance if a migration has started, or `nil` if either no migrations are required or if a failure occured. - returns: an `NSProgress` instance if a migration has started, or `nil` if either no migrations are required or if a failure occured.
*/ */
public static func addStorage<T: LocalStorage>(_ storage: T, completion: (SetupResult<T>) -> Void) -> Progress? { public static func addStorage<T: LocalStorage>(_ storage: T, completion: @escaping (SetupResult<T>) -> Void) -> Progress? {
return self.defaultStack.addStorage(storage, completion: completion) return self.defaultStack.addStorage(storage, completion: completion)
} }
@@ -144,7 +144,7 @@ public extension CoreStore {
- parameter storage: the cloud storage - parameter storage: the cloud storage
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `CloudStorage` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `CloudStorage` was already added at the same URL and with the same configuration. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `CloudStorage` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `CloudStorage` was already added at the same URL and with the same configuration.
*/ */
public static func addStorage<T: CloudStorage>(_ storage: T, completion: (SetupResult<T>) -> Void) { public static func addStorage<T: CloudStorage>(_ storage: T, completion: @escaping (SetupResult<T>) -> Void) {
self.defaultStack.addStorage(storage, completion: completion) self.defaultStack.addStorage(storage, completion: completion)
} }
@@ -157,7 +157,7 @@ public extension CoreStore {
- throws: a `CoreStoreError` value indicating the failure - throws: a `CoreStoreError` value indicating the failure
- returns: an `NSProgress` instance if a migration has started, or `nil` is no migrations are required - returns: an `NSProgress` instance if a migration has started, or `nil` is no migrations are required
*/ */
public static func upgradeStorageIfNeeded<T: LocalStorage>(_ storage: T, completion: (MigrationResult) -> Void) throws -> Progress? { public static func upgradeStorageIfNeeded<T: LocalStorage>(_ storage: T, completion: @escaping (MigrationResult) -> Void) throws -> Progress? {
return try self.defaultStack.upgradeStorageIfNeeded(storage, completion: completion) return try self.defaultStack.upgradeStorageIfNeeded(storage, completion: completion)
} }
+12 -12
View File
@@ -47,7 +47,7 @@ public extension DataStack {
- parameter storeType: the storage type - parameter storeType: the storage type
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `StorageInterface` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `StorageInterface` was already added at the same URL and with the same configuration. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `StorageInterface` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `StorageInterface` was already added at the same URL and with the same configuration.
*/ */
public func addStorage<T: StorageInterface>(_ storeType: T.Type, completion: (SetupResult<T>) -> Void) where T: DefaultInitializableStore { public func addStorage<T: StorageInterface>(_ storeType: T.Type, completion: @escaping (SetupResult<T>) -> Void) where T: DefaultInitializableStore {
self.addStorage(storeType.init(), completion: completion) self.addStorage(storeType.init(), completion: completion)
} }
@@ -126,7 +126,7 @@ public extension DataStack {
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `LocalStorage` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `SetupResult` argument indicates the result. Note that the `LocalStorage` associated to the `SetupResult.success` may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration.
- returns: an `NSProgress` instance if a migration has started, or `nil` if either no migrations are required or if a failure occured. - returns: an `NSProgress` instance if a migration has started, or `nil` if either no migrations are required or if a failure occured.
*/ */
public func addStorage<T: LocalStorage>(_ storeType: T.Type, completion: (SetupResult<T>) -> Void) -> Progress? where T: DefaultInitializableStore { public func addStorage<T: LocalStorage>(_ storeType: T.Type, completion: @escaping (SetupResult<T>) -> Void) -> Progress? where T: DefaultInitializableStore {
return self.addStorage(storeType.init() as! T.Type, completion: completion) return self.addStorage(storeType.init() as! T.Type, completion: completion)
} }
@@ -194,7 +194,7 @@ public extension DataStack {
do { do {
try FileManager.default.createDirectory( try FileManager.default.createDirectory(
at: try fileURL.deletingLastPathComponent(), at: fileURL.deletingLastPathComponent(),
withIntermediateDirectories: true, withIntermediateDirectories: true,
attributes: nil attributes: nil
) )
@@ -207,7 +207,7 @@ public extension DataStack {
return self.upgradeStorageIfNeeded( return self.upgradeStorageIfNeeded(
storage, storage,
metadata: metadata as [String : AnyObject], metadata: metadata,
completion: { (result) -> Void in completion: { (result) -> Void in
if case .failure(.internalError(let error)) = result { if case .failure(.internalError(let error)) = result {
@@ -359,7 +359,7 @@ public extension DataStack {
do { do {
try FileManager.default.createDirectory( try FileManager.default.createDirectory(
at: try cacheFileURL.deletingLastPathComponent(), at: cacheFileURL.deletingLastPathComponent(),
withIntermediateDirectories: true, withIntermediateDirectories: true,
attributes: nil attributes: nil
) )
@@ -431,7 +431,7 @@ public extension DataStack {
- throws: a `CoreStoreError` value indicating the failure - throws: a `CoreStoreError` value indicating the failure
- returns: an `NSProgress` instance if a migration has started, or `nil` is no migrations are required - returns: an `NSProgress` instance if a migration has started, or `nil` is no migrations are required
*/ */
public func upgradeStorageIfNeeded<T: LocalStorage>(_ storage: T, completion: (MigrationResult) -> Void) throws -> Progress? { public func upgradeStorageIfNeeded<T: LocalStorage>(_ storage: T, completion: @escaping (MigrationResult) -> Void) throws -> Progress? {
return try self.coordinator.performSynchronously { return try self.coordinator.performSynchronously {
@@ -450,7 +450,7 @@ public extension DataStack {
) )
return self.upgradeStorageIfNeeded( return self.upgradeStorageIfNeeded(
storage, storage,
metadata: metadata as [String : AnyObject], metadata: metadata,
completion: completion completion: completion
) )
} }
@@ -491,7 +491,7 @@ public extension DataStack {
options: storage.storeOptions options: storage.storeOptions
) )
guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata as [String : AnyObject]) else { guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else {
let error = CoreStoreError.mappingModelNotFound( let error = CoreStoreError.mappingModelNotFound(
localStoreURL: fileURL, localStoreURL: fileURL,
@@ -537,7 +537,7 @@ public extension DataStack {
// MARK: Private // MARK: Private
private func upgradeStorageIfNeeded<T: LocalStorage>(_ storage: T, metadata: [String: AnyObject], completion: @escaping (MigrationResult) -> Void) -> Progress? { private func upgradeStorageIfNeeded<T: LocalStorage>(_ storage: T, metadata: [String: Any], completion: @escaping (MigrationResult) -> Void) -> Progress? {
guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else { guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else {
@@ -654,7 +654,7 @@ public extension DataStack {
return progress return progress
} }
private func computeMigrationFromStorage<T: LocalStorage>(_ storage: T, metadata: [String: AnyObject]) -> [(sourceModel: NSManagedObjectModel, destinationModel: NSManagedObjectModel, mappingModel: NSMappingModel, migrationType: MigrationType)]? { private func computeMigrationFromStorage<T: LocalStorage>(_ storage: T, metadata: [String: Any]) -> [(sourceModel: NSManagedObjectModel, destinationModel: NSManagedObjectModel, mappingModel: NSMappingModel, migrationType: MigrationType)]? {
let model = self.model let model = self.model
if model.isConfiguration(withName: storage.configuration, compatibleWithStoreMetadata: metadata) { if model.isConfiguration(withName: storage.configuration, compatibleWithStoreMetadata: metadata) {
@@ -737,7 +737,7 @@ public extension DataStack {
let fileURL = storage.fileURL let fileURL = storage.fileURL
let temporaryDirectoryURL = try! URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true) let temporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
.appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack") .appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack")
.appendingPathComponent(ProcessInfo().globallyUniqueString) .appendingPathComponent(ProcessInfo().globallyUniqueString)
@@ -748,7 +748,7 @@ public extension DataStack {
attributes: nil attributes: nil
) )
let temporaryFileURL = try! temporaryDirectoryURL.appendingPathComponent( let temporaryFileURL = temporaryDirectoryURL.appendingPathComponent(
fileURL.lastPathComponent, fileURL.lastPathComponent,
isDirectory: false isDirectory: false
) )
+1 -1
View File
@@ -246,7 +246,7 @@ public struct MigrationChain: ExpressibleByNilLiteral, ExpressibleByStringLitera
// MARK: Private // MARK: Private
private let versionTree: [String: String] fileprivate let versionTree: [String: String]
} }
+2 -2
View File
@@ -90,11 +90,11 @@ public enum MigrationResult: Hashable {
switch self { switch self {
case .success(let migrationTypes): case .success(let migrationTypes):
return self.boolValue.hashValue return true.hashValue
^ migrationTypes.map { $0.hashValue }.reduce(0, ^).hashValue ^ migrationTypes.map { $0.hashValue }.reduce(0, ^).hashValue
case .failure(let error): case .failure(let error):
return self.boolValue.hashValue ^ error.hashValue return false.hashValue ^ error.hashValue
} }
} }
+1 -1
View File
@@ -126,7 +126,7 @@ public enum MigrationType: Hashable {
public var hashValue: Int { public var hashValue: Int {
let preHash = self.boolValue.hashValue ^ self.isHeavyweightMigration.hashValue let preHash = self.hasMigration.hashValue ^ self.isHeavyweightMigration.hashValue
switch self { switch self {
case .none(let version): case .none(let version):
+2 -2
View File
@@ -93,10 +93,10 @@ public enum SetupResult<T: StorageInterface>: Hashable {
switch self { switch self {
case .success(let storage): case .success(let storage):
return self.boolValue.hashValue ^ ObjectIdentifier(storage).hashValue return true.hashValue ^ ObjectIdentifier(storage).hashValue
case .failure(let error): case .failure(let error):
return self.boolValue.hashValue ^ error.hashValue return false.hashValue ^ error.hashValue
} }
} }
@@ -65,7 +65,7 @@ public final class CSAsynchronousDataTransaction: CSBaseDataTransaction {
self.bridgeToSwift.beginSynchronous { (transaction) in self.bridgeToSwift.beginSynchronous { (transaction) in
closure(transaction: transaction.bridgeToObjectiveC) closure(transaction.bridgeToObjectiveC)
} }
} }
} }
@@ -88,7 +88,7 @@ public final class CSAsynchronousDataTransaction: CSBaseDataTransaction {
- returns: a new `NSManagedObject` instance of the specified entity type. - returns: a new `NSManagedObject` instance of the specified entity type.
*/ */
@objc @objc
public override func createInto(_ into: CSInto) -> AnyObject { public override func createInto(_ into: CSInto) -> Any {
return self.bridgeToSwift.create(into.bridgeToSwift) return self.bridgeToSwift.create(into.bridgeToSwift)
} }
@@ -100,7 +100,7 @@ public final class CSAsynchronousDataTransaction: CSBaseDataTransaction {
- returns: an editable proxy for the specified `NSManagedObject`. - returns: an editable proxy for the specified `NSManagedObject`.
*/ */
@objc @objc
public override func editObject(_ object: NSManagedObject?) -> AnyObject? { public override func editObject(_ object: NSManagedObject?) -> Any? {
return self.bridgeToSwift.edit(object) return self.bridgeToSwift.edit(object)
} }
@@ -113,7 +113,7 @@ public final class CSAsynchronousDataTransaction: CSBaseDataTransaction {
- returns: an editable proxy for the specified `NSManagedObject`. - returns: an editable proxy for the specified `NSManagedObject`.
*/ */
@objc @objc
public override func editInto(_ into: CSInto, objectID: NSManagedObjectID) -> AnyObject? { public override func editInto(_ into: CSInto, objectID: NSManagedObjectID) -> Any? {
return self.bridgeToSwift.edit(into.bridgeToSwift, objectID) return self.bridgeToSwift.edit(into.bridgeToSwift, objectID)
} }
@@ -38,7 +38,7 @@ public extension CSBaseDataTransaction {
- returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found. - returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found.
*/ */
@objc @objc
public func fetchExistingObject(_ object: NSManagedObject) -> AnyObject? { public func fetchExistingObject(_ object: NSManagedObject) -> Any? {
do { do {
@@ -57,7 +57,7 @@ public extension CSBaseDataTransaction {
- returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found. - returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found.
*/ */
@objc @objc
public func fetchExistingObjectWithID(_ objectID: NSManagedObjectID) -> AnyObject? { public func fetchExistingObjectWithID(_ objectID: NSManagedObjectID) -> Any? {
do { do {
@@ -76,7 +76,7 @@ public extension CSBaseDataTransaction {
- returns: the `NSManagedObject` array for objects that exists in the transaction - returns: the `NSManagedObject` array for objects that exists in the transaction
*/ */
@objc @objc
public func fetchExistingObjects(_ objects: [NSManagedObject]) -> [AnyObject] { public func fetchExistingObjects(_ objects: [NSManagedObject]) -> [Any] {
return objects.flatMap { try? self.bridgeToSwift.context.existingObject(with: $0.objectID) } return objects.flatMap { try? self.bridgeToSwift.context.existingObject(with: $0.objectID) }
} }
@@ -88,7 +88,7 @@ public extension CSBaseDataTransaction {
- returns: the `NSManagedObject` array for objects that exists in the transaction - returns: the `NSManagedObject` array for objects that exists in the transaction
*/ */
@objc @objc
public func fetchExistingObjectsWithIDs(_ objectIDs: [NSManagedObjectID]) -> [AnyObject] { public func fetchExistingObjectsWithIDs(_ objectIDs: [NSManagedObjectID]) -> [Any] {
return objectIDs.flatMap { try? self.bridgeToSwift.context.existingObject(with: $0) } return objectIDs.flatMap { try? self.bridgeToSwift.context.existingObject(with: $0) }
} }
@@ -101,7 +101,7 @@ public extension CSBaseDataTransaction {
- returns: the first `NSManagedObject` instance that satisfies the specified `CSFetchClause`s - returns: the first `NSManagedObject` instance that satisfies the specified `CSFetchClause`s
*/ */
@objc @objc
public func fetchOneFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> AnyObject? { public func fetchOneFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> Any? {
CoreStore.assert( CoreStore.assert(
self.bridgeToSwift.isRunningInAllowedQueue(), self.bridgeToSwift.isRunningInAllowedQueue(),
@@ -118,7 +118,7 @@ public extension CSBaseDataTransaction {
- returns: all `NSManagedObject` instances that satisfy the specified `CSFetchClause`s - returns: all `NSManagedObject` instances that satisfy the specified `CSFetchClause`s
*/ */
@objc @objc
public func fetchAllFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> [AnyObject]? { public func fetchAllFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> [Any]? {
CoreStore.assert( CoreStore.assert(
self.bridgeToSwift.isRunningInAllowedQueue(), self.bridgeToSwift.isRunningInAllowedQueue(),
@@ -141,7 +141,9 @@ public extension CSBaseDataTransaction {
self.bridgeToSwift.isRunningInAllowedQueue(), self.bridgeToSwift.isRunningInAllowedQueue(),
"Attempted to fetch from a \(cs_typeName(self)) outside its designated queue." "Attempted to fetch from a \(cs_typeName(self)) outside its designated queue."
) )
return self.bridgeToSwift.context.fetchCount(from, fetchClauses) return self.bridgeToSwift.context
.fetchCount(from, fetchClauses)
.flatMap { NSNumber(value: $0) }
} }
/** /**
@@ -172,7 +174,7 @@ public extension CSBaseDataTransaction {
- returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter.
*/ */
@objc @objc
public func queryValueFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> AnyObject? { public func queryValueFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> Any? {
CoreStore.assert( CoreStore.assert(
self.bridgeToSwift.isRunningInAllowedQueue(), self.bridgeToSwift.isRunningInAllowedQueue(),
@@ -192,7 +194,7 @@ public extension CSBaseDataTransaction {
- returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter.
*/ */
@objc @objc
public func queryAttributesFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> [[NSString: AnyObject]]? { public func queryAttributesFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> [[String: Any]]? {
CoreStore.assert( CoreStore.assert(
self.bridgeToSwift.isRunningInAllowedQueue(), self.bridgeToSwift.isRunningInAllowedQueue(),
@@ -55,7 +55,7 @@ public class CSBaseDataTransaction: NSObject, CoreStoreObjectiveCType {
- returns: a new `NSManagedObject` instance of the specified entity type. - returns: a new `NSManagedObject` instance of the specified entity type.
*/ */
@objc @objc
public func createInto(_ into: CSInto) -> AnyObject { public func createInto(_ into: CSInto) -> Any {
return self.bridgeToSwift.create(into.bridgeToSwift) return self.bridgeToSwift.create(into.bridgeToSwift)
} }
@@ -67,7 +67,7 @@ public class CSBaseDataTransaction: NSObject, CoreStoreObjectiveCType {
- returns: an editable proxy for the specified `NSManagedObject`. - returns: an editable proxy for the specified `NSManagedObject`.
*/ */
@objc @objc
public func editObject(_ object: NSManagedObject?) -> AnyObject? { public func editObject(_ object: NSManagedObject?) -> Any? {
return self.bridgeToSwift.edit(object) return self.bridgeToSwift.edit(object)
} }
@@ -80,7 +80,7 @@ public class CSBaseDataTransaction: NSObject, CoreStoreObjectiveCType {
- returns: an editable proxy for the specified `NSManagedObject`. - returns: an editable proxy for the specified `NSManagedObject`.
*/ */
@objc @objc
public func editInto(_ into: CSInto, objectID: NSManagedObjectID) -> AnyObject? { public func editInto(_ into: CSInto, objectID: NSManagedObjectID) -> Any? {
return self.bridgeToSwift.edit(into.bridgeToSwift, objectID) return self.bridgeToSwift.edit(into.bridgeToSwift, objectID)
} }
@@ -47,7 +47,7 @@ public extension CSCoreStore {
- parameter storage: the `CSInMemoryStore` instance - parameter storage: the `CSInMemoryStore` instance
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `CSSetupResult` argument indicates the result. This closure is NOT executed if an error is thrown, but will be executed with a failure `CSSetupResult` result if an error occurs asynchronously. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `CSSetupResult` argument indicates the result. This closure is NOT executed if an error is thrown, but will be executed with a failure `CSSetupResult` result if an error occurs asynchronously.
*/ */
public static func addInMemoryStorage(_ storage: CSInMemoryStore, completion: (CSSetupResult) -> Void) { public static func addInMemoryStorage(_ storage: CSInMemoryStore, completion: @escaping (CSSetupResult) -> Void) {
self.defaultStack.addInMemoryStorage(storage, completion: completion) self.defaultStack.addInMemoryStorage(storage, completion: completion)
} }
@@ -72,7 +72,7 @@ public extension CSCoreStore {
- parameter error: the `NSError` pointer that indicates the reason in case of an failure - parameter error: the `NSError` pointer that indicates the reason in case of an failure
- returns: an `NSProgress` instance if a migration has started. `nil` if no migrations are required or if `error` was set. - returns: an `NSProgress` instance if a migration has started. `nil` if no migrations are required or if `error` was set.
*/ */
public static func addSQLiteStorage(_ storage: CSSQLiteStore, completion: (CSSetupResult) -> Void, error: NSErrorPointer) -> Progress? { public static func addSQLiteStorage(_ storage: CSSQLiteStore, completion: @escaping (CSSetupResult) -> Void, error: NSErrorPointer) -> Progress? {
return self.defaultStack.addSQLiteStorage(storage, completion: completion, error: error) return self.defaultStack.addSQLiteStorage(storage, completion: completion, error: error)
} }
@@ -86,7 +86,7 @@ public extension CSCoreStore {
- returns: an `NSProgress` instance if a migration has started. `nil` if no migrations are required or if `error` was set. - returns: an `NSProgress` instance if a migration has started. `nil` if no migrations are required or if `error` was set.
*/ */
@objc @objc
public static func upgradeStorageIfNeeded(_ storage: CSSQLiteStore, completion: (CSMigrationResult) -> Void, error: NSErrorPointer) -> Progress? { public static func upgradeStorageIfNeeded(_ storage: CSSQLiteStore, completion: @escaping (CSMigrationResult) -> Void, error: NSErrorPointer) -> Progress? {
return self.defaultStack.upgradeStorageIfNeeded(storage, completion: completion, error: error) return self.defaultStack.upgradeStorageIfNeeded(storage, completion: completion, error: error)
} }
@@ -66,7 +66,7 @@ public extension CSCoreStore {
- parameter fetchClauses: a series of `CSFetchClause` instances for fetching the object list. Accepts `CSWhere`, `CSOrderBy`, and `CSTweak` clauses. - parameter fetchClauses: a series of `CSFetchClause` instances for fetching the object list. Accepts `CSWhere`, `CSOrderBy`, and `CSTweak` clauses.
*/ */
@objc @objc
public static func monitorListByCreatingAsynchronously(_ createAsynchronously: (CSListMonitor) -> Void, from: CSFrom, fetchClauses: [CSFetchClause]) { public static func monitorListByCreatingAsynchronously(_ createAsynchronously: @escaping (CSListMonitor) -> Void, from: CSFrom, fetchClauses: [CSFetchClause]) {
return self.defaultStack.monitorListByCreatingAsynchronously( return self.defaultStack.monitorListByCreatingAsynchronously(
createAsynchronously, createAsynchronously,
@@ -102,7 +102,7 @@ public extension CSCoreStore {
- parameter fetchClauses: a series of `CSFetchClause` instances for fetching the object list. Accepts `CSWhere`, `CSOrderBy`, and `CSTweak` clauses. - parameter fetchClauses: a series of `CSFetchClause` instances for fetching the object list. Accepts `CSWhere`, `CSOrderBy`, and `CSTweak` clauses.
*/ */
@objc @objc
public static func monitorSectionedListByCreatingAsynchronously(_ createAsynchronously: (CSListMonitor) -> Void, from: CSFrom, sectionBy: CSSectionBy, fetchClauses: [CSFetchClause]) { public static func monitorSectionedListByCreatingAsynchronously(_ createAsynchronously: @escaping (CSListMonitor) -> Void, from: CSFrom, sectionBy: CSSectionBy, fetchClauses: [CSFetchClause]) {
self.defaultStack.monitorSectionedListByCreatingAsynchronously( self.defaultStack.monitorSectionedListByCreatingAsynchronously(
createAsynchronously, createAsynchronously,
@@ -38,7 +38,7 @@ public extension CSCoreStore {
- returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found. - returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found.
*/ */
@objc @objc
public static func fetchExistingObject(_ object: NSManagedObject) -> AnyObject? { public static func fetchExistingObject(_ object: NSManagedObject) -> Any? {
return self.defaultStack.fetchExistingObject(object) return self.defaultStack.fetchExistingObject(object)
} }
@@ -50,7 +50,7 @@ public extension CSCoreStore {
- returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found. - returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found.
*/ */
@objc @objc
public static func fetchExistingObjectWithID(_ objectID: NSManagedObjectID) -> AnyObject? { public static func fetchExistingObjectWithID(_ objectID: NSManagedObjectID) -> Any? {
return self.defaultStack.fetchExistingObjectWithID(objectID) return self.defaultStack.fetchExistingObjectWithID(objectID)
} }
@@ -62,7 +62,7 @@ public extension CSCoreStore {
- returns: the `NSManagedObject` array for objects that exists in the transaction - returns: the `NSManagedObject` array for objects that exists in the transaction
*/ */
@objc @objc
public static func fetchExistingObjects(_ objects: [NSManagedObject]) -> [AnyObject] { public static func fetchExistingObjects(_ objects: [NSManagedObject]) -> [Any] {
return self.defaultStack.fetchExistingObjects(objects) return self.defaultStack.fetchExistingObjects(objects)
} }
@@ -74,7 +74,7 @@ public extension CSCoreStore {
- returns: the `NSManagedObject` array for objects that exists in the transaction - returns: the `NSManagedObject` array for objects that exists in the transaction
*/ */
@objc @objc
public static func fetchExistingObjectsWithIDs(_ objectIDs: [NSManagedObjectID]) -> [AnyObject] { public static func fetchExistingObjectsWithIDs(_ objectIDs: [NSManagedObjectID]) -> [Any] {
return self.defaultStack.fetchExistingObjectsWithIDs(objectIDs) return self.defaultStack.fetchExistingObjectsWithIDs(objectIDs)
} }
@@ -87,7 +87,7 @@ public extension CSCoreStore {
- returns: the first `NSManagedObject` instance that satisfies the specified `CSFetchClause`s - returns: the first `NSManagedObject` instance that satisfies the specified `CSFetchClause`s
*/ */
@objc @objc
public static func fetchOneFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> AnyObject? { public static func fetchOneFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> Any? {
return self.defaultStack.fetchOneFrom(from, fetchClauses: fetchClauses) return self.defaultStack.fetchOneFrom(from, fetchClauses: fetchClauses)
} }
@@ -100,7 +100,7 @@ public extension CSCoreStore {
- returns: all `NSManagedObject` instances that satisfy the specified `CSFetchClause`s - returns: all `NSManagedObject` instances that satisfy the specified `CSFetchClause`s
*/ */
@objc @objc
public static func fetchAllFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> [AnyObject]? { public static func fetchAllFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> [Any]? {
return self.defaultStack.fetchAllFrom(from, fetchClauses: fetchClauses) return self.defaultStack.fetchAllFrom(from, fetchClauses: fetchClauses)
} }
@@ -155,7 +155,7 @@ public extension CSCoreStore {
- returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter.
*/ */
@objc @objc
public static func queryValueFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> AnyObject? { public static func queryValueFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> Any? {
return self.defaultStack.queryValueFrom(from, selectClause: selectClause, queryClauses: queryClauses) return self.defaultStack.queryValueFrom(from, selectClause: selectClause, queryClauses: queryClauses)
} }
@@ -171,7 +171,7 @@ public extension CSCoreStore {
- returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter.
*/ */
@objc @objc
public static func queryAttributesFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> [[NSString: AnyObject]]? { public static func queryAttributesFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> [[String: Any]]? {
return self.defaultStack.queryAttributesFrom(from, selectClause: selectClause, queryClauses: queryClauses) return self.defaultStack.queryAttributesFrom(from, selectClause: selectClause, queryClauses: queryClauses)
} }
@@ -58,7 +58,7 @@ public extension CSCoreStore {
CoreStore.beginSynchronous { (transaction) in CoreStore.beginSynchronous { (transaction) in
closure(transaction: transaction.bridgeToObjectiveC) closure(transaction.bridgeToObjectiveC)
} }
} }
} }
@@ -48,7 +48,7 @@ public extension CSDataStack {
- parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `CSSetupResult` argument indicates the result. This closure is NOT executed if an error is thrown, but will be executed with a failure `CSSetupResult` result if an error occurs asynchronously. - parameter completion: the closure to be executed on the main queue when the process completes, either due to success or failure. The closure's `CSSetupResult` argument indicates the result. This closure is NOT executed if an error is thrown, but will be executed with a failure `CSSetupResult` result if an error occurs asynchronously.
*/ */
@objc @objc
public func addInMemoryStorage(_ storage: CSInMemoryStore, completion: (CSSetupResult) -> Void) { public func addInMemoryStorage(_ storage: CSInMemoryStore, completion: @escaping (CSSetupResult) -> Void) {
self.bridgeToSwift.addStorage( self.bridgeToSwift.addStorage(
storage.bridgeToSwift, storage.bridgeToSwift,
@@ -77,7 +77,7 @@ public extension CSDataStack {
- returns: an `NSProgress` instance if a migration has started. `nil` if no migrations are required or if `error` was set. - returns: an `NSProgress` instance if a migration has started. `nil` if no migrations are required or if `error` was set.
*/ */
@objc @objc
public func addSQLiteStorage(_ storage: CSSQLiteStore, completion: (CSSetupResult) -> Void, error: NSErrorPointer) -> Progress? { public func addSQLiteStorage(_ storage: CSSQLiteStore, completion: @escaping (CSSetupResult) -> Void, error: NSErrorPointer) -> Progress? {
return bridge(error) { return bridge(error) {
@@ -97,7 +97,7 @@ public extension CSDataStack {
- returns: an `NSProgress` instance if a migration has started. `nil` if no migrations are required or if `error` was set. - returns: an `NSProgress` instance if a migration has started. `nil` if no migrations are required or if `error` was set.
*/ */
@objc @objc
public func upgradeStorageIfNeeded(_ storage: CSSQLiteStore, completion: (CSMigrationResult) -> Void, error: NSErrorPointer) -> Progress? { public func upgradeStorageIfNeeded(_ storage: CSSQLiteStore, completion: @escaping (CSMigrationResult) -> Void, error: NSErrorPointer) -> Progress? {
return bridge(error) { return bridge(error) {
@@ -88,7 +88,7 @@ public extension CSDataStack {
- parameter fetchClauses: a series of `CSFetchClause` instances for fetching the object list. Accepts `CSWhere`, `CSOrderBy`, and `CSTweak` clauses. - parameter fetchClauses: a series of `CSFetchClause` instances for fetching the object list. Accepts `CSWhere`, `CSOrderBy`, and `CSTweak` clauses.
*/ */
@objc @objc
public func monitorListByCreatingAsynchronously(_ createAsynchronously: (CSListMonitor) -> Void, from: CSFrom, fetchClauses: [CSFetchClause]) { public func monitorListByCreatingAsynchronously(_ createAsynchronously: @escaping (CSListMonitor) -> Void, from: CSFrom, fetchClauses: [CSFetchClause]) {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
@@ -154,7 +154,7 @@ public extension CSDataStack {
- parameter sectionBy: a `CSSectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections. - parameter sectionBy: a `CSSectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections.
- parameter fetchClauses: a series of `CSFetchClause` instances for fetching the object list. Accepts `CSWhere`, `CSOrderBy`, and `CSTweak` clauses. - parameter fetchClauses: a series of `CSFetchClause` instances for fetching the object list. Accepts `CSWhere`, `CSOrderBy`, and `CSTweak` clauses.
*/ */
public func monitorSectionedListByCreatingAsynchronously(_ createAsynchronously: (CSListMonitor) -> Void, from: CSFrom, sectionBy: CSSectionBy, fetchClauses: [CSFetchClause]) { public func monitorSectionedListByCreatingAsynchronously(_ createAsynchronously: @escaping (CSListMonitor) -> Void, from: CSFrom, sectionBy: CSSectionBy, fetchClauses: [CSFetchClause]) {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
+11 -9
View File
@@ -38,7 +38,7 @@ public extension CSDataStack {
- returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found. - returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found.
*/ */
@objc @objc
public func fetchExistingObject(_ object: NSManagedObject) -> AnyObject? { public func fetchExistingObject(_ object: NSManagedObject) -> Any? {
do { do {
@@ -57,7 +57,7 @@ public extension CSDataStack {
- returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found. - returns: the `NSManagedObject` instance if the object exists in the transaction, or `nil` if not found.
*/ */
@objc @objc
public func fetchExistingObjectWithID(_ objectID: NSManagedObjectID) -> AnyObject? { public func fetchExistingObjectWithID(_ objectID: NSManagedObjectID) -> Any? {
do { do {
@@ -76,7 +76,7 @@ public extension CSDataStack {
- returns: the `NSManagedObject` array for objects that exists in the transaction - returns: the `NSManagedObject` array for objects that exists in the transaction
*/ */
@objc @objc
public func fetchExistingObjects(_ objects: [NSManagedObject]) -> [AnyObject] { public func fetchExistingObjects(_ objects: [NSManagedObject]) -> [Any] {
return objects.flatMap { try? self.bridgeToSwift.mainContext.existingObject(with: $0.objectID) } return objects.flatMap { try? self.bridgeToSwift.mainContext.existingObject(with: $0.objectID) }
} }
@@ -88,7 +88,7 @@ public extension CSDataStack {
- returns: the `NSManagedObject` array for objects that exists in the transaction - returns: the `NSManagedObject` array for objects that exists in the transaction
*/ */
@objc @objc
public func fetchExistingObjectsWithIDs(_ objectIDs: [NSManagedObjectID]) -> [AnyObject] { public func fetchExistingObjectsWithIDs(_ objectIDs: [NSManagedObjectID]) -> [Any] {
return objectIDs.flatMap { try? self.bridgeToSwift.mainContext.existingObject(with: $0) } return objectIDs.flatMap { try? self.bridgeToSwift.mainContext.existingObject(with: $0) }
} }
@@ -101,7 +101,7 @@ public extension CSDataStack {
- returns: the first `NSManagedObject` instance that satisfies the specified `CSFetchClause`s - returns: the first `NSManagedObject` instance that satisfies the specified `CSFetchClause`s
*/ */
@objc @objc
public func fetchOneFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> AnyObject? { public func fetchOneFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> Any? {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
@@ -118,7 +118,7 @@ public extension CSDataStack {
- returns: all `NSManagedObject` instances that satisfy the specified `CSFetchClause`s - returns: all `NSManagedObject` instances that satisfy the specified `CSFetchClause`s
*/ */
@objc @objc
public func fetchAllFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> [AnyObject]? { public func fetchAllFrom(_ from: CSFrom, fetchClauses: [CSFetchClause]) -> [Any]? {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
@@ -141,7 +141,9 @@ public extension CSDataStack {
Thread.isMainThread, Thread.isMainThread,
"Attempted to fetch from a \(cs_typeName(self)) outside the main thread." "Attempted to fetch from a \(cs_typeName(self)) outside the main thread."
) )
return self.bridgeToSwift.mainContext.fetchCount(from, fetchClauses) return self.bridgeToSwift.mainContext
.fetchCount(from, fetchClauses)
.flatMap { NSNumber(value: $0) }
} }
/** /**
@@ -189,7 +191,7 @@ public extension CSDataStack {
- returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter.
*/ */
@objc @objc
public func queryValueFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> AnyObject? { public func queryValueFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> Any? {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
@@ -209,7 +211,7 @@ public extension CSDataStack {
- returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter. - returns: the result of the the query. The type of the return value is specified by the generic type of the `CSSelect` parameter.
*/ */
@objc @objc
public func queryAttributesFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> [[NSString: AnyObject]]? { public func queryAttributesFrom(_ from: CSFrom, selectClause: CSSelect, queryClauses: [CSQueryClause]) -> [[String: Any]]? {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
@@ -58,7 +58,7 @@ public extension CSDataStack {
self.bridgeToSwift.beginSynchronous { (transaction) in self.bridgeToSwift.beginSynchronous { (transaction) in
closure(transaction: transaction.bridgeToObjectiveC) closure(transaction.bridgeToObjectiveC)
} }
} }
} }
+7 -7
View File
@@ -140,7 +140,7 @@ public final class CSError: NSError, CoreStoreObjectiveCType {
self.swiftError = swiftValue self.swiftError = swiftValue
let code: CoreStoreErrorCode let code: CoreStoreErrorCode
let info: [NSObject: AnyObject] let info: [AnyHashable: Any]
switch swiftValue { switch swiftValue {
case .unknown: case .unknown:
@@ -150,27 +150,27 @@ public final class CSError: NSError, CoreStoreObjectiveCType {
case .differentStorageExistsAtURL(let existingPersistentStoreURL): case .differentStorageExistsAtURL(let existingPersistentStoreURL):
code = .differentStorageExistsAtURL code = .differentStorageExistsAtURL
info = [ info = [
"existingPersistentStoreURL" as NSObject: existingPersistentStoreURL as AnyObject "existingPersistentStoreURL": existingPersistentStoreURL
] ]
case .mappingModelNotFound(let localStoreURL, let targetModel, let targetModelVersion): case .mappingModelNotFound(let localStoreURL, let targetModel, let targetModelVersion):
code = .mappingModelNotFound code = .mappingModelNotFound
info = [ info = [
"localStoreURL" as NSObject: localStoreURL as AnyObject, "localStoreURL": localStoreURL,
"targetModel" as NSObject: targetModel, "targetModel": targetModel,
"targetModelVersion" as NSObject: targetModelVersion as AnyObject "targetModelVersion": targetModelVersion
] ]
case .progressiveMigrationRequired(let localStoreURL): case .progressiveMigrationRequired(let localStoreURL):
code = .progressiveMigrationRequired code = .progressiveMigrationRequired
info = [ info = [
"localStoreURL" as NSObject: localStoreURL as AnyObject "localStoreURL": localStoreURL
] ]
case .internalError(let NSError): case .internalError(let NSError):
code = .internalError code = .internalError
info = [ info = [
"NSError" as NSObject: NSError "NSError": NSError
] ]
} }
+3 -3
View File
@@ -51,7 +51,7 @@ public final class CSFrom: NSObject, CoreStoreObjectiveCType {
May contain `NSString` instances to pertain to named configurations, or `NSNull` to pertain to the default configuration May contain `NSString` instances to pertain to named configurations, or `NSNull` to pertain to the default configuration
*/ */
@objc @objc
public var configurations: [AnyObject]? { public var configurations: [Any]? {
return self.bridgeToSwift.configurations?.map { return self.bridgeToSwift.configurations?.map {
@@ -85,7 +85,7 @@ public final class CSFrom: NSObject, CoreStoreObjectiveCType {
- parameter configuration: the `NSPersistentStore` configuration name to associate objects from. This parameter is required if multiple configurations contain the created `NSManagedObject`'s entity type. Set to `[NSNull null]` to use the default configuration. - parameter configuration: the `NSPersistentStore` configuration name to associate objects from. This parameter is required if multiple configurations contain the created `NSManagedObject`'s entity type. Set to `[NSNull null]` to use the default configuration.
*/ */
@objc @objc
public convenience init(entityClass: AnyClass, configuration: AnyObject) { public convenience init(entityClass: AnyClass, configuration: Any) {
switch configuration { switch configuration {
@@ -111,7 +111,7 @@ public final class CSFrom: NSObject, CoreStoreObjectiveCType {
- parameter configurations: an array of the `NSPersistentStore` configuration names to associate objects from. This parameter is required if multiple configurations contain the created `NSManagedObject`'s entity type. Set to `[NSNull null]` to use the default configuration. - parameter configurations: an array of the `NSPersistentStore` configuration names to associate objects from. This parameter is required if multiple configurations contain the created `NSManagedObject`'s entity type. Set to `[NSNull null]` to use the default configuration.
*/ */
@objc @objc
public convenience init(entityClass: AnyClass, configurations: [AnyObject]) { public convenience init(entityClass: AnyClass, configurations: [Any]) {
var arguments = [String?]() var arguments = [String?]()
for configuration in configurations { for configuration in configurations {
+1 -1
View File
@@ -79,7 +79,7 @@ public final class CSInMemoryStore: NSObject, CSStorageInterface, CoreStoreObjec
The options dictionary for the `NSPersistentStore`. For `CSInMemoryStore`s, this is always set to `nil`. The options dictionary for the `NSPersistentStore`. For `CSInMemoryStore`s, this is always set to `nil`.
*/ */
@objc @objc
public var storeOptions: [String: AnyObject]? { public var storeOptions: [AnyHashable: Any]? {
return self.bridgeToSwift.storeOptions return self.bridgeToSwift.storeOptions
} }
+13 -11
View File
@@ -48,7 +48,7 @@ public final class CSListMonitor: NSObject, CoreStoreObjectiveCType {
- returns: the `NSManagedObject` at the specified index - returns: the `NSManagedObject` at the specified index
*/ */
@objc @objc
public subscript(index: Int) -> AnyObject { public subscript(index: Int) -> Any {
return self.bridgeToSwift[index] return self.bridgeToSwift[index]
} }
@@ -60,7 +60,7 @@ public final class CSListMonitor: NSObject, CoreStoreObjectiveCType {
- returns: the `NSManagedObject` at the specified index, or `nil` if out of bounds - returns: the `NSManagedObject` at the specified index, or `nil` if out of bounds
*/ */
@objc @objc
public func objectAtSafeIndex(_ index: Int) -> AnyObject? { public func objectAtSafeIndex(_ index: Int) -> Any? {
return self.bridgeToSwift[safeIndex: index] return self.bridgeToSwift[safeIndex: index]
} }
@@ -73,12 +73,10 @@ public final class CSListMonitor: NSObject, CoreStoreObjectiveCType {
- returns: the `NSManagedObject` at the specified section and item index - returns: the `NSManagedObject` at the specified section and item index
*/ */
@objc @objc
public func objectAtSectionIndex(_ sectionIndex: Int, itemIndex: Int) -> AnyObject { public func objectAtSectionIndex(_ sectionIndex: Int, itemIndex: Int) -> Any {
return self.bridgeToSwift[sectionIndex, itemIndex] return self.bridgeToSwift[sectionIndex, itemIndex]
} } /**
/**
Returns the object at the given section and item index, or `nil` if out of bounds. This indexer is typically used for `CSListMonitor`s created as sectioned lists. Returns the object at the given section and item index, or `nil` if out of bounds. This indexer is typically used for `CSListMonitor`s created as sectioned lists.
- parameter sectionIndex: the section index for the object. Using a `sectionIndex` with an invalid range will return `nil`. - parameter sectionIndex: the section index for the object. Using a `sectionIndex` with an invalid range will return `nil`.
@@ -86,7 +84,7 @@ public final class CSListMonitor: NSObject, CoreStoreObjectiveCType {
- returns: the `NSManagedObject` at the specified section and item index, or `nil` if out of bounds - returns: the `NSManagedObject` at the specified section and item index, or `nil` if out of bounds
*/ */
@objc @objc
public func objectAtSafeSectionIndex(_ sectionIndex: Int, safeItemIndex itemIndex: Int) -> AnyObject? { public func objectAtSafeSectionIndex(_ sectionIndex: Int, safeItemIndex itemIndex: Int) -> Any? {
return self.bridgeToSwift[safeSectionIndex: sectionIndex, safeItemIndex: itemIndex] return self.bridgeToSwift[safeSectionIndex: sectionIndex, safeItemIndex: itemIndex]
} }
@@ -98,7 +96,7 @@ public final class CSListMonitor: NSObject, CoreStoreObjectiveCType {
- returns: the `NSManagedObject` at the specified index path - returns: the `NSManagedObject` at the specified index path
*/ */
@objc @objc
public func objectAtIndexPath(_ indexPath: IndexPath) -> AnyObject { public func objectAtIndexPath(_ indexPath: IndexPath) -> Any {
return self.bridgeToSwift[indexPath] return self.bridgeToSwift[indexPath]
} }
@@ -110,7 +108,7 @@ public final class CSListMonitor: NSObject, CoreStoreObjectiveCType {
- returns: the `NSManagedObject` at the specified index path, or `nil` if out of bounds - returns: the `NSManagedObject` at the specified index path, or `nil` if out of bounds
*/ */
@objc @objc
public func objectAtSafeIndexPath(_ indexPath: IndexPath) -> AnyObject? { public func objectAtSafeIndexPath(_ indexPath: IndexPath) -> Any? {
return self.bridgeToSwift[safeIndexPath: indexPath] return self.bridgeToSwift[safeIndexPath: indexPath]
} }
@@ -216,7 +214,9 @@ public final class CSListMonitor: NSObject, CoreStoreObjectiveCType {
@objc @objc
public func numberOfObjectsInSafeSection(safeSectionIndex section: Int) -> NSNumber? { public func numberOfObjectsInSafeSection(safeSectionIndex section: Int) -> NSNumber? {
return self.bridgeToSwift.numberOfObjectsInSection(safeSectionIndex: section) return self.bridgeToSwift
.numberOfObjectsInSection(safeSectionIndex: section)
.flatMap { NSNumber(value: $0) }
} }
/** /**
@@ -287,7 +287,9 @@ public final class CSListMonitor: NSObject, CoreStoreObjectiveCType {
@objc @objc
public func indexOf(_ object: NSManagedObject) -> NSNumber? { public func indexOf(_ object: NSManagedObject) -> NSNumber? {
return self.bridgeToSwift.indexOf(object) return self.bridgeToSwift
.indexOf(object)
.flatMap { NSNumber(value: $0) }
} }
/** /**
+4 -4
View File
@@ -103,7 +103,7 @@ public protocol CSListObjectObserver: CSListObserver {
- parameter indexPath: the new `NSIndexPath` for the inserted object - parameter indexPath: the new `NSIndexPath` for the inserted object
*/ */
@objc @objc
optional func listMonitor(_ monitor: CSListMonitor, didInsertObject object: AnyObject, toIndexPath indexPath: IndexPath) optional func listMonitor(_ monitor: CSListMonitor, didInsertObject object: Any, toIndexPath indexPath: IndexPath)
/** /**
Notifies that an object was deleted from the specified `NSIndexPath` in the list Notifies that an object was deleted from the specified `NSIndexPath` in the list
@@ -113,7 +113,7 @@ public protocol CSListObjectObserver: CSListObserver {
- parameter indexPath: the `NSIndexPath` for the deleted object - parameter indexPath: the `NSIndexPath` for the deleted object
*/ */
@objc @objc
optional func listMonitor(_ monitor: CSListMonitor, didDeleteObject object: AnyObject, fromIndexPath indexPath: IndexPath) optional func listMonitor(_ monitor: CSListMonitor, didDeleteObject object: Any, fromIndexPath indexPath: IndexPath)
/** /**
Notifies that an object at the specified `NSIndexPath` was updated Notifies that an object at the specified `NSIndexPath` was updated
@@ -123,7 +123,7 @@ public protocol CSListObjectObserver: CSListObserver {
- parameter indexPath: the `NSIndexPath` for the updated object - parameter indexPath: the `NSIndexPath` for the updated object
*/ */
@objc @objc
optional func listMonitor(_ monitor: CSListMonitor, didUpdateObject object: AnyObject, atIndexPath indexPath: IndexPath) optional func listMonitor(_ monitor: CSListMonitor, didUpdateObject object: Any, atIndexPath indexPath: IndexPath)
/** /**
Notifies that an object's index changed Notifies that an object's index changed
@@ -134,7 +134,7 @@ public protocol CSListObjectObserver: CSListObserver {
- parameter toIndexPath: the new `NSIndexPath` for the moved object - parameter toIndexPath: the new `NSIndexPath` for the moved object
*/ */
@objc @objc
optional func listMonitor(_ monitor: CSListMonitor, didMoveObject object: AnyObject, fromIndexPath: IndexPath, toIndexPath: IndexPath) optional func listMonitor(_ monitor: CSListMonitor, didMoveObject object: Any, fromIndexPath: IndexPath, toIndexPath: IndexPath)
} }
+2 -2
View File
@@ -43,7 +43,7 @@ public final class CSMigrationResult: NSObject, CoreStoreObjectiveCType {
@objc @objc
public var isSuccess: Bool { public var isSuccess: Bool {
return self.bridgeToSwift.boolValue return self.bridgeToSwift.isSuccess
} }
/** /**
@@ -52,7 +52,7 @@ public final class CSMigrationResult: NSObject, CoreStoreObjectiveCType {
@objc @objc
public var isFailure: Bool { public var isFailure: Bool {
return !self.bridgeToSwift.boolValue return !self.bridgeToSwift.isSuccess
} }
/** /**
+1 -1
View File
@@ -43,7 +43,7 @@ public final class CSMigrationType: NSObject, CoreStoreObjectiveCType {
@objc @objc
public var needsMigration: Bool { public var needsMigration: Bool {
return self.bridgeToSwift.boolValue return self.bridgeToSwift.hasMigration
} }
/** /**
+1 -1
View File
@@ -42,7 +42,7 @@ public final class CSObjectMonitor: NSObject, CoreStoreObjectiveCType {
/** /**
Returns the `NSManagedObject` instance being observed, or `nil` if the object was already deleted. Returns the `NSManagedObject` instance being observed, or `nil` if the object was already deleted.
*/ */
public var object: AnyObject? { public var object: Any? {
return self.bridgeToSwift.object return self.bridgeToSwift.object
} }
+3 -3
View File
@@ -50,7 +50,7 @@ public protocol CSObjectObserver: class, AnyObject {
- parameter object: the `NSManagedObject` instance being observed - parameter object: the `NSManagedObject` instance being observed
*/ */
@objc @objc
optional func objectMonitor(_ monitor: CSObjectMonitor, willUpdateObject object: AnyObject) optional func objectMonitor(_ monitor: CSObjectMonitor, willUpdateObject object: Any)
/** /**
Handles processing right after a change to the observed `object` occurs Handles processing right after a change to the observed `object` occurs
@@ -60,7 +60,7 @@ public protocol CSObjectObserver: class, AnyObject {
- parameter changedPersistentKeys: an `NSSet` of key paths for the attributes that were changed. Note that `changedPersistentKeys` only contains keys for attributes/relationships present in the persistent store, thus transient properties will not be reported. - parameter changedPersistentKeys: an `NSSet` of key paths for the attributes that were changed. Note that `changedPersistentKeys` only contains keys for attributes/relationships present in the persistent store, thus transient properties will not be reported.
*/ */
@objc @objc
optional func objectMonitor(_ monitor: CSObjectMonitor, didUpdateObject object: AnyObject, changedPersistentKeys: Set<String>) optional func objectMonitor(_ monitor: CSObjectMonitor, didUpdateObject object: Any, changedPersistentKeys: Set<String>)
/** /**
Handles processing right after `object` is deleted Handles processing right after `object` is deleted
@@ -69,7 +69,7 @@ public protocol CSObjectObserver: class, AnyObject {
- parameter object: the `NSManagedObject` instance being observed - parameter object: the `NSManagedObject` instance being observed
*/ */
@objc @objc
optional func objectMonitor(_ monitor: CSObjectMonitor, didDeleteObject object: AnyObject) optional func objectMonitor(_ monitor: CSObjectMonitor, didDeleteObject object: Any)
} }
#endif #endif
+3 -3
View File
@@ -41,7 +41,7 @@ public final class CSOrderBy: NSObject, CSFetchClause, CSQueryClause, CSDeleteCl
The list of sort descriptors The list of sort descriptors
*/ */
@objc @objc
public var sortDescriptors: [SortDescriptor] { public var sortDescriptors: [NSSortDescriptor] {
return self.bridgeToSwift.sortDescriptors return self.bridgeToSwift.sortDescriptors
} }
@@ -56,7 +56,7 @@ public final class CSOrderBy: NSObject, CSFetchClause, CSQueryClause, CSDeleteCl
- parameter sortDescriptor: a `NSSortDescriptor` - parameter sortDescriptor: a `NSSortDescriptor`
*/ */
@objc @objc
public convenience init(sortDescriptor: SortDescriptor) { public convenience init(sortDescriptor: NSSortDescriptor) {
self.init(OrderBy(sortDescriptor)) self.init(OrderBy(sortDescriptor))
} }
@@ -71,7 +71,7 @@ public final class CSOrderBy: NSObject, CSFetchClause, CSQueryClause, CSDeleteCl
- parameter sortDescriptors: an array of `NSSortDescriptor`s - parameter sortDescriptors: an array of `NSSortDescriptor`s
*/ */
@objc @objc
public convenience init(sortDescriptors: [SortDescriptor]) { public convenience init(sortDescriptors: [NSSortDescriptor]) {
self.init(OrderBy(sortDescriptors)) self.init(OrderBy(sortDescriptors))
} }
+1 -1
View File
@@ -145,7 +145,7 @@ public final class CSSQLiteStore: NSObject, CSLocalStorage, CoreStoreObjectiveCT
``` ```
*/ */
@objc @objc
public var storeOptions: [String: AnyObject]? { public var storeOptions: [AnyHashable: Any]? {
return self.bridgeToSwift.storeOptions return self.bridgeToSwift.storeOptions
} }
+1 -1
View File
@@ -59,7 +59,7 @@ public final class CSSectionBy: NSObject, CoreStoreObjectiveCType {
- returns: a `CSSectionBy` clause with the key path to use to group `CSListMonitor` objects into sections - returns: a `CSSectionBy` clause with the key path to use to group `CSListMonitor` objects into sections
*/ */
@objc @objc
public static func keyPath(_ sectionKeyPath: KeyPath, sectionIndexTransformer: (_ sectionName: String?) -> String?) -> CSSectionBy { public static func keyPath(_ sectionKeyPath: KeyPath, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String?) -> CSSectionBy {
return self.init(SectionBy(sectionKeyPath, sectionIndexTransformer)) return self.init(SectionBy(sectionKeyPath, sectionIndexTransformer))
} }
+6 -6
View File
@@ -67,7 +67,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
@objc @objc
public static func average(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm { public static func average(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
return self.init(.average(keyPath, As: alias)) return self.init(.average(keyPath, as: alias))
} }
/** /**
@@ -84,7 +84,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
@objc @objc
public static func count(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm { public static func count(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
return self.init(.count(keyPath, As: alias)) return self.init(.count(keyPath, as: alias))
} }
/** /**
@@ -101,7 +101,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
@objc @objc
public static func maximum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm { public static func maximum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
return self.init(.maximum(keyPath, As: alias)) return self.init(.maximum(keyPath, as: alias))
} }
/** /**
@@ -118,7 +118,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
@objc @objc
public static func minimum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm { public static func minimum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
return self.init(.minimum(keyPath, As: alias)) return self.init(.minimum(keyPath, as: alias))
} }
/** /**
@@ -135,7 +135,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
@objc @objc
public static func sum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm { public static func sum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
return self.init(.sum(keyPath, As: alias)) return self.init(.sum(keyPath, as: alias))
} }
/** /**
@@ -153,7 +153,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
@objc @objc
public static func objectIDAs(_ alias: KeyPath? = nil) -> CSSelectTerm { public static func objectIDAs(_ alias: KeyPath? = nil) -> CSSelectTerm {
return self.init(.objectID(As: alias)) return self.init(.objectID(as: alias))
} }
+1 -1
View File
@@ -53,7 +53,7 @@ public protocol CSStorageInterface {
The options dictionary for the `NSPersistentStore` The options dictionary for the `NSPersistentStore`
*/ */
@objc @objc
var storeOptions: [String: AnyObject]? { get } var storeOptions: [AnyHashable: Any]? { get }
} }
@@ -65,7 +65,7 @@ public final class CSSynchronousDataTransaction: CSBaseDataTransaction {
self.bridgeToSwift.beginSynchronous { (transaction) in self.bridgeToSwift.beginSynchronous { (transaction) in
closure(transaction: transaction.bridgeToObjectiveC) closure(transaction.bridgeToObjectiveC)
} }
} }
} }
@@ -88,7 +88,7 @@ public final class CSSynchronousDataTransaction: CSBaseDataTransaction {
- returns: a new `NSManagedObject` instance of the specified entity type. - returns: a new `NSManagedObject` instance of the specified entity type.
*/ */
@objc @objc
public override func createInto(_ into: CSInto) -> AnyObject { public override func createInto(_ into: CSInto) -> Any {
return self.bridgeToSwift.create(into.bridgeToSwift) return self.bridgeToSwift.create(into.bridgeToSwift)
} }
@@ -100,7 +100,7 @@ public final class CSSynchronousDataTransaction: CSBaseDataTransaction {
- returns: an editable proxy for the specified `NSManagedObject`. - returns: an editable proxy for the specified `NSManagedObject`.
*/ */
@objc @objc
public override func editObject(_ object: NSManagedObject?) -> AnyObject? { public override func editObject(_ object: NSManagedObject?) -> Any? {
return self.bridgeToSwift.edit(object) return self.bridgeToSwift.edit(object)
} }
@@ -113,7 +113,7 @@ public final class CSSynchronousDataTransaction: CSBaseDataTransaction {
- returns: an editable proxy for the specified `NSManagedObject`. - returns: an editable proxy for the specified `NSManagedObject`.
*/ */
@objc @objc
public override func editInto(_ into: CSInto, objectID: NSManagedObjectID) -> AnyObject? { public override func editInto(_ into: CSInto, objectID: NSManagedObjectID) -> Any? {
return self.bridgeToSwift.edit(into.bridgeToSwift, objectID) return self.bridgeToSwift.edit(into.bridgeToSwift, objectID)
} }
+1 -1
View File
@@ -53,7 +53,7 @@ public final class CSTweak: NSObject, CSFetchClause, CSQueryClause, CSDeleteClau
- parameter block: the block to customize the `NSFetchRequest` - parameter block: the block to customize the `NSFetchRequest`
*/ */
@objc @objc
public convenience init(block: (_ fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> Void) { public convenience init(block: @escaping (_ fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> Void) {
self.init(Tweak(block)) self.init(Tweak(block))
} }
+2 -2
View File
@@ -41,7 +41,7 @@ public final class CSWhere: NSObject, CSFetchClause, CSQueryClause, CSDeleteClau
The internal `NSPredicate` instance for the `Where` clause The internal `NSPredicate` instance for the `Where` clause
*/ */
@objc @objc
public var predicate: Predicate { public var predicate: NSPredicate {
return self.bridgeToSwift.predicate return self.bridgeToSwift.predicate
} }
@@ -108,7 +108,7 @@ public final class CSWhere: NSObject, CSFetchClause, CSQueryClause, CSDeleteClau
- parameter predicate: the `NSPredicate` for the fetch or query - parameter predicate: the `NSPredicate` for the fetch or query
*/ */
@objc @objc
public convenience init(predicate: Predicate) { public convenience init(predicate: NSPredicate) {
self.init(Where(predicate)) self.init(Where(predicate))
} }
@@ -38,7 +38,7 @@ public extension NSManagedObject {
- returns: the primitive value for the KVC key - returns: the primitive value for the KVC key
*/ */
@objc @objc
public func cs_accessValueForKVCKey(_ KVCKey: KeyPath) -> AnyObject? { public func cs_accessValueForKVCKey(_ KVCKey: KeyPath) -> Any? {
return self.accessValueForKVCKey(KVCKey) return self.accessValueForKVCKey(KVCKey)
} }
@@ -50,7 +50,7 @@ public extension NSManagedObject {
- parameter KVCKey: the KVC key - parameter KVCKey: the KVC key
*/ */
@objc @objc
public func cs_setValue(_ value: AnyObject?, forKVCKey KVCKey: KeyPath) { public func cs_setValue(_ value: Any?, forKVCKey KVCKey: KeyPath) {
self.setValue(value, forKVCKey: KVCKey) self.setValue(value, forKVCKey: KVCKey)
} }
@@ -135,7 +135,7 @@ internal extension NSManagedObjectContext {
} }
@nonobjc @nonobjc
internal func queryValue(_ from: CSFrom, _ selectClause: CSSelect, _ queryClauses: [CSQueryClause]) -> AnyObject? { internal func queryValue(_ from: CSFrom, _ selectClause: CSSelect, _ queryClauses: [CSQueryClause]) -> Any? {
let fetchRequest = CoreStoreFetchRequest<NSFetchRequestResult>() let fetchRequest = CoreStoreFetchRequest<NSFetchRequestResult>()
let storeFound = from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) let storeFound = from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self)
@@ -154,7 +154,7 @@ internal extension NSManagedObjectContext {
} }
@nonobjc @nonobjc
internal func queryAttributes(_ from: CSFrom, _ selectClause: CSSelect, _ queryClauses: [CSQueryClause]) -> [[NSString: AnyObject]]? { internal func queryAttributes(_ from: CSFrom, _ selectClause: CSSelect, _ queryClauses: [CSQueryClause]) -> [[String: Any]]? {
let fetchRequest = CoreStoreFetchRequest<NSFetchRequestResult>() let fetchRequest = CoreStoreFetchRequest<NSFetchRequestResult>()
let storeFound = from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) let storeFound = from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self)
+4 -4
View File
@@ -75,7 +75,7 @@ public extension CoreStore {
- parameter from: a `From` clause indicating the entity type - parameter from: a `From` clause indicating the entity type
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public static func monitorList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: FetchClause...) { public static func monitorList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: FetchClause...) {
self.defaultStack.monitorList(createAsynchronously: createAsynchronously, from, fetchClauses) self.defaultStack.monitorList(createAsynchronously: createAsynchronously, from, fetchClauses)
} }
@@ -87,7 +87,7 @@ public extension CoreStore {
- parameter from: a `From` clause indicating the entity type - parameter from: a `From` clause indicating the entity type
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public static func monitorList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: [FetchClause]) { public static func monitorList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: [FetchClause]) {
self.defaultStack.monitorList(createAsynchronously: createAsynchronously, from, fetchClauses) self.defaultStack.monitorList(createAsynchronously: createAsynchronously, from, fetchClauses)
} }
@@ -126,7 +126,7 @@ public extension CoreStore {
- parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections. - parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections.
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public static func monitorSectionedList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: FetchClause...) { public static func monitorSectionedList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: FetchClause...) {
self.defaultStack.monitorSectionedList(createAsynchronously: createAsynchronously, from, sectionBy, fetchClauses) self.defaultStack.monitorSectionedList(createAsynchronously: createAsynchronously, from, sectionBy, fetchClauses)
} }
@@ -139,7 +139,7 @@ public extension CoreStore {
- parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections. - parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections.
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public static func monitorSectionedList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: [FetchClause]) { public static func monitorSectionedList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: [FetchClause]) {
self.defaultStack.monitorSectionedList(createAsynchronously: createAsynchronously, from, sectionBy, fetchClauses) self.defaultStack.monitorSectionedList(createAsynchronously: createAsynchronously, from, sectionBy, fetchClauses)
} }
+4 -4
View File
@@ -96,7 +96,7 @@ public extension DataStack {
- parameter from: a `From` clause indicating the entity type - parameter from: a `From` clause indicating the entity type
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public func monitorList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: FetchClause...) { public func monitorList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: FetchClause...) {
self.monitorList(createAsynchronously: createAsynchronously, from, fetchClauses) self.monitorList(createAsynchronously: createAsynchronously, from, fetchClauses)
} }
@@ -108,7 +108,7 @@ public extension DataStack {
- parameter from: a `From` clause indicating the entity type - parameter from: a `From` clause indicating the entity type
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public func monitorList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: [FetchClause]) { public func monitorList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: [FetchClause]) {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
@@ -183,7 +183,7 @@ public extension DataStack {
- parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections. - parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections.
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public func monitorSectionedList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: FetchClause...) { public func monitorSectionedList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: FetchClause...) {
self.monitorSectionedList(createAsynchronously: createAsynchronously, from, sectionBy, fetchClauses) self.monitorSectionedList(createAsynchronously: createAsynchronously, from, sectionBy, fetchClauses)
} }
@@ -196,7 +196,7 @@ public extension DataStack {
- parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections. - parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections.
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public func monitorSectionedList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: [FetchClause]) { public func monitorSectionedList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: [FetchClause]) {
CoreStore.assert( CoreStore.assert(
Thread.isMainThread, Thread.isMainThread,
+53 -83
View File
@@ -604,7 +604,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
// MARK: Internal // MARK: Internal
internal convenience init(dataStack: DataStack, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void) { internal convenience init(dataStack: DataStack, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void) {
self.init( self.init(
context: dataStack.mainContext, context: dataStack.mainContext,
@@ -616,7 +616,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
) )
} }
internal convenience init(dataStack: DataStack, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void, createAsynchronously: (ListMonitor<T>) -> Void) { internal convenience init(dataStack: DataStack, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void, createAsynchronously: @escaping (ListMonitor<T>) -> Void) {
self.init( self.init(
context: dataStack.mainContext, context: dataStack.mainContext,
@@ -628,7 +628,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
) )
} }
internal convenience init(unsafeTransaction: UnsafeDataTransaction, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void) { internal convenience init(unsafeTransaction: UnsafeDataTransaction, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void) {
self.init( self.init(
context: unsafeTransaction.context, context: unsafeTransaction.context,
@@ -640,7 +640,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
) )
} }
internal convenience init(unsafeTransaction: UnsafeDataTransaction, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void, createAsynchronously: (ListMonitor<T>) -> Void) { internal convenience init(unsafeTransaction: UnsafeDataTransaction, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void, createAsynchronously: @escaping (ListMonitor<T>) -> Void) {
self.init( self.init(
context: unsafeTransaction.context, context: unsafeTransaction.context,
@@ -687,15 +687,15 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
guard let `self` = self, guard let `self` = self,
let userInfo = note.userInfo, let userInfo = note.userInfo,
let object = userInfo[String(NSManagedObject.self)] as? T else { let object = userInfo[String(describing: NSManagedObject.self)] as? T else {
return return
} }
callback( callback(
self, self,
object, object,
userInfo[String(IndexPath.self)] as? IndexPath, userInfo[String(describing: IndexPath.self)] as? IndexPath,
userInfo["\(String(IndexPath.self)).New"] as? IndexPath userInfo["\(String(describing: IndexPath.self)).New"] as? IndexPath
) )
} }
), ),
@@ -714,8 +714,8 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
guard let `self` = self, guard let `self` = self,
let userInfo = note.userInfo, let userInfo = note.userInfo,
let sectionInfo = userInfo[String(NSFetchedResultsSectionInfo.self)] as? NSFetchedResultsSectionInfo, let sectionInfo = userInfo[String(describing: NSFetchedResultsSectionInfo.self)] as? NSFetchedResultsSectionInfo,
let sectionIndex = (userInfo[String(NSNumber.self)] as? NSNumber)?.intValue else { let sectionIndex = (userInfo[String(describing: NSNumber.self)] as? NSNumber)?.intValue else {
return return
} }
@@ -743,7 +743,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
willChange(observer: observer, monitor: monitor) willChange(observer, monitor)
} }
) )
self.registerChangeNotification( self.registerChangeNotification(
@@ -756,7 +756,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
didChange(observer: observer, monitor: monitor) didChange(observer, monitor)
} }
) )
self.registerChangeNotification( self.registerChangeNotification(
@@ -769,7 +769,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
willRefetch(observer: observer, monitor: monitor) willRefetch(observer, monitor)
} }
) )
self.registerChangeNotification( self.registerChangeNotification(
@@ -782,7 +782,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
didRefetch(observer: observer, monitor: monitor) didRefetch(observer, monitor)
} }
) )
} }
@@ -804,12 +804,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
didInsertObject( didInsertObject(observer, monitor, object, newIndexPath!)
observer: observer,
monitor: monitor,
object: object,
toIndexPath: newIndexPath!
)
} }
) )
self.registerObjectNotification( self.registerObjectNotification(
@@ -822,12 +817,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
didDeleteObject( didDeleteObject(observer, monitor, object, indexPath!)
observer: observer,
monitor: monitor,
object: object,
fromIndexPath: indexPath!
)
} }
) )
self.registerObjectNotification( self.registerObjectNotification(
@@ -840,12 +830,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
didUpdateObject( didUpdateObject(observer, monitor, object, indexPath!)
observer: observer,
monitor: monitor,
object: object,
atIndexPath: indexPath!
)
} }
) )
self.registerObjectNotification( self.registerObjectNotification(
@@ -858,13 +843,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
didMoveObject( didMoveObject(observer, monitor, object, indexPath!, newIndexPath!)
observer: observer,
monitor: monitor,
object: object,
fromIndexPath: indexPath!,
toIndexPath: newIndexPath!
)
} }
) )
} }
@@ -886,12 +865,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
didInsertSection( didInsertSection(observer, monitor, sectionInfo, sectionIndex)
observer: observer,
monitor: monitor,
sectionInfo: sectionInfo,
toIndex: sectionIndex
)
} }
) )
self.registerSectionNotification( self.registerSectionNotification(
@@ -904,12 +878,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
return return
} }
didDeleteSection( didDeleteSection(observer, monitor, sectionInfo, sectionIndex)
observer: observer,
monitor: monitor,
sectionInfo: sectionInfo,
fromIndex: sectionIndex
)
} }
) )
} }
@@ -953,7 +922,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
} }
self.applyFetchClauses = applyFetchClauses self.applyFetchClauses = applyFetchClauses
self.taskGroup.notify(.main) { [weak self] () -> Void in self.taskGroup.notify(queue: .main) { [weak self] () -> Void in
guard let `self` = self else { guard let `self` = self else {
@@ -961,7 +930,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
} }
self.fetchedResultsControllerDelegate.enabled = false self.fetchedResultsControllerDelegate.enabled = false
self.applyFetchClauses(fetchRequest: self.fetchedResultsController.fetchRequest) self.applyFetchClauses(self.fetchedResultsController.fetchRequest)
self.transactionQueue.async { [weak self] in self.transactionQueue.async { [weak self] in
@@ -1000,6 +969,10 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
// MARK: Private // MARK: Private
fileprivate let fetchedResultsController: CoreStoreFetchedResultsController
fileprivate let taskGroup = DispatchGroup()
fileprivate let sectionIndexTransformer: (_ sectionName: KeyPath?) -> String?
private var willChangeListKey: Void? private var willChangeListKey: Void?
private var didChangeListKey: Void? private var didChangeListKey: Void?
private var willRefetchListKey: Void? private var willRefetchListKey: Void?
@@ -1013,12 +986,9 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
private var didInsertSectionKey: Void? private var didInsertSectionKey: Void?
private var didDeleteSectionKey: Void? private var didDeleteSectionKey: Void?
private let fetchedResultsController: CoreStoreFetchedResultsController
private let fetchedResultsControllerDelegate: FetchedResultsControllerDelegate<T> private let fetchedResultsControllerDelegate: FetchedResultsControllerDelegate<T>
private let sectionIndexTransformer: (_ sectionName: KeyPath?) -> String?
private var observerForWillChangePersistentStore: NotificationObserver! private var observerForWillChangePersistentStore: NotificationObserver!
private var observerForDidChangePersistentStore: NotificationObserver! private var observerForDidChangePersistentStore: NotificationObserver!
private let taskGroup = DispatchGroup()
private let transactionQueue: DispatchQueue private let transactionQueue: DispatchQueue
private var applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void private var applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void
@@ -1043,7 +1013,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
} }
} }
private init(context: NSManagedObjectContext, transactionQueue: DispatchQueue, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void, createAsynchronously: ((ListMonitor<T>) -> Void)?) { private init(context: NSManagedObjectContext, transactionQueue: DispatchQueue, from: From<T>, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest<NSManagedObject>) -> Void, createAsynchronously: ((ListMonitor<T>) -> Void)?) {
let fetchRequest = CoreStoreFetchRequest<T>() let fetchRequest = CoreStoreFetchRequest<T>()
fetchRequest.fetchLimit = 0 fetchRequest.fetchLimit = 0
@@ -1139,7 +1109,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
transactionQueue.async { transactionQueue.async {
try! fetchedResultsController.performFetchFromSpecifiedStores() try! fetchedResultsController.performFetchFromSpecifiedStores()
self.taskGroup.notify(.main) { self.taskGroup.notify(queue: .main) {
createAsynchronously(self) createAsynchronously(self)
} }
@@ -1184,7 +1154,7 @@ extension ListMonitor: FetchedResultsControllerHandler {
// MARK: FetchedResultsControllerHandler // MARK: FetchedResultsControllerHandler
internal func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeObject anObject: AnyObject, atIndexPath indexPath: IndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { internal func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeObject anObject: Any, atIndexPath indexPath: IndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type { switch type {
@@ -1193,8 +1163,8 @@ extension ListMonitor: FetchedResultsControllerHandler {
name: Notification.Name.listMonitorDidInsertObject, name: Notification.Name.listMonitorDidInsertObject,
object: self, object: self,
userInfo: [ userInfo: [
String(NSManagedObject.self): anObject, String(describing: NSManagedObject.self): anObject,
"\(String(IndexPath.self)).New": newIndexPath! "\(String(describing: IndexPath.self)).New": newIndexPath!
] ]
) )
@@ -1203,8 +1173,8 @@ extension ListMonitor: FetchedResultsControllerHandler {
name: Notification.Name.listMonitorDidDeleteObject, name: Notification.Name.listMonitorDidDeleteObject,
object: self, object: self,
userInfo: [ userInfo: [
String(NSManagedObject.self): anObject, String(describing: NSManagedObject.self): anObject,
String(IndexPath.self): indexPath! String(describing: IndexPath.self): indexPath!
] ]
) )
@@ -1213,8 +1183,8 @@ extension ListMonitor: FetchedResultsControllerHandler {
name: Notification.Name.listMonitorDidUpdateObject, name: Notification.Name.listMonitorDidUpdateObject,
object: self, object: self,
userInfo: [ userInfo: [
String(NSManagedObject.self): anObject, String(describing: NSManagedObject.self): anObject,
String(IndexPath.self): indexPath! String(describing: IndexPath.self): indexPath!
] ]
) )
@@ -1223,9 +1193,9 @@ extension ListMonitor: FetchedResultsControllerHandler {
name: Notification.Name.listMonitorDidMoveObject, name: Notification.Name.listMonitorDidMoveObject,
object: self, object: self,
userInfo: [ userInfo: [
String(NSManagedObject.self): anObject, String(describing: NSManagedObject.self): anObject,
String(IndexPath.self): indexPath!, String(describing: IndexPath.self): indexPath!,
"\(String(IndexPath.self)).New": newIndexPath! "\(String(describing: IndexPath.self)).New": newIndexPath!
] ]
) )
} }
@@ -1240,8 +1210,8 @@ extension ListMonitor: FetchedResultsControllerHandler {
name: Notification.Name.listMonitorDidInsertSection, name: Notification.Name.listMonitorDidInsertSection,
object: self, object: self,
userInfo: [ userInfo: [
String(NSFetchedResultsSectionInfo.self): sectionInfo, String(describing: NSFetchedResultsSectionInfo.self): sectionInfo,
String(NSNumber.self): NSNumber(value: sectionIndex) String(describing: NSNumber.self): NSNumber(value: sectionIndex)
] ]
) )
@@ -1250,8 +1220,8 @@ extension ListMonitor: FetchedResultsControllerHandler {
name: Notification.Name.listMonitorDidDeleteSection, name: Notification.Name.listMonitorDidDeleteSection,
object: self, object: self,
userInfo: [ userInfo: [
String(NSFetchedResultsSectionInfo.self): sectionInfo, String(describing: NSFetchedResultsSectionInfo.self): sectionInfo,
String(NSNumber.self): NSNumber(value: sectionIndex) String(describing: NSNumber.self): NSNumber(value: sectionIndex)
] ]
) )
@@ -1280,25 +1250,25 @@ extension ListMonitor: FetchedResultsControllerHandler {
internal func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, sectionIndexTitleForSectionName sectionName: String?) -> String? { internal func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, sectionIndexTitleForSectionName sectionName: String?) -> String? {
return self.sectionIndexTransformer(sectionName: sectionName) return self.sectionIndexTransformer(sectionName)
} }
} }
// MARK: - Notification Keys // MARK: - Notification Keys
private extension Notification.Name { fileprivate extension Notification.Name {
private static let listMonitorWillChangeList = Notification.Name(rawValue: "listMonitorWillChangeList") fileprivate static let listMonitorWillChangeList = Notification.Name(rawValue: "listMonitorWillChangeList")
private static let listMonitorDidChangeList = Notification.Name(rawValue: "listMonitorDidChangeList") fileprivate static let listMonitorDidChangeList = Notification.Name(rawValue: "listMonitorDidChangeList")
private static let listMonitorWillRefetchList = Notification.Name(rawValue: "listMonitorWillRefetchList") fileprivate static let listMonitorWillRefetchList = Notification.Name(rawValue: "listMonitorWillRefetchList")
private static let listMonitorDidRefetchList = Notification.Name(rawValue: "listMonitorDidRefetchList") fileprivate static let listMonitorDidRefetchList = Notification.Name(rawValue: "listMonitorDidRefetchList")
private static let listMonitorDidInsertObject = Notification.Name(rawValue: "listMonitorDidInsertObject") fileprivate static let listMonitorDidInsertObject = Notification.Name(rawValue: "listMonitorDidInsertObject")
private static let listMonitorDidDeleteObject = Notification.Name(rawValue: "listMonitorDidDeleteObject") fileprivate static let listMonitorDidDeleteObject = Notification.Name(rawValue: "listMonitorDidDeleteObject")
private static let listMonitorDidUpdateObject = Notification.Name(rawValue: "listMonitorDidUpdateObject") fileprivate static let listMonitorDidUpdateObject = Notification.Name(rawValue: "listMonitorDidUpdateObject")
private static let listMonitorDidMoveObject = Notification.Name(rawValue: "listMonitorDidMoveObject") fileprivate static let listMonitorDidMoveObject = Notification.Name(rawValue: "listMonitorDidMoveObject")
private static let listMonitorDidInsertSection = Notification.Name(rawValue: "listMonitorDidInsertSection") fileprivate static let listMonitorDidInsertSection = Notification.Name(rawValue: "listMonitorDidInsertSection")
private static let listMonitorDidDeleteSection = Notification.Name(rawValue: "listMonitorDidDeleteSection") fileprivate static let listMonitorDidDeleteSection = Notification.Name(rawValue: "listMonitorDidDeleteSection")
} }
#endif #endif
+1 -1
View File
@@ -322,7 +322,7 @@ extension ObjectMonitor: FetchedResultsControllerHandler {
internal func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { } internal func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { }
internal func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeObject anObject: AnyObject, atIndexPath indexPath: IndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { internal func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeObject anObject: Any, atIndexPath indexPath: IndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type { switch type {
@@ -91,7 +91,7 @@ public extension UnsafeDataTransaction {
- parameter from: a `From` clause indicating the entity type - parameter from: a `From` clause indicating the entity type
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public func monitorList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: FetchClause...) { public func monitorList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: FetchClause...) {
self.monitorList(createAsynchronously: createAsynchronously, from, fetchClauses) self.monitorList(createAsynchronously: createAsynchronously, from, fetchClauses)
} }
@@ -103,7 +103,7 @@ public extension UnsafeDataTransaction {
- parameter from: a `From` clause indicating the entity type - parameter from: a `From` clause indicating the entity type
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public func monitorList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: [FetchClause]) { public func monitorList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ fetchClauses: [FetchClause]) {
CoreStore.assert( CoreStore.assert(
fetchClauses.filter { $0 is OrderBy }.count > 0, fetchClauses.filter { $0 is OrderBy }.count > 0,
@@ -169,7 +169,7 @@ public extension UnsafeDataTransaction {
- parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections. - parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections.
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public func monitorSectionedList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: FetchClause...) { public func monitorSectionedList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: FetchClause...) {
self.monitorSectionedList(createAsynchronously: createAsynchronously, from, sectionBy, fetchClauses) self.monitorSectionedList(createAsynchronously: createAsynchronously, from, sectionBy, fetchClauses)
} }
@@ -182,7 +182,7 @@ public extension UnsafeDataTransaction {
- parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections. - parameter sectionBy: a `SectionBy` clause indicating the keyPath for the attribute to use when sorting the list into sections.
- parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses. - parameter fetchClauses: a series of `FetchClause` instances for fetching the object list. Accepts `Where`, `OrderBy`, and `Tweak` clauses.
*/ */
public func monitorSectionedList<T: NSManagedObject>(createAsynchronously: (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: [FetchClause]) { public func monitorSectionedList<T: NSManagedObject>(createAsynchronously: @escaping (ListMonitor<T>) -> Void, _ from: From<T>, _ sectionBy: SectionBy, _ fetchClauses: [FetchClause]) {
CoreStore.assert( CoreStore.assert(
fetchClauses.filter { $0 is OrderBy }.count > 0, fetchClauses.filter { $0 is OrderBy }.count > 0,
+5 -8
View File
@@ -241,7 +241,7 @@ public final class DataStack {
do { do {
try FileManager.default.createDirectory( try FileManager.default.createDirectory(
at: try fileURL.deletingLastPathComponent(), at: fileURL.deletingLastPathComponent(),
withIntermediateDirectories: true, withIntermediateDirectories: true,
attributes: nil attributes: nil
) )
@@ -336,7 +336,7 @@ public final class DataStack {
do { do {
try FileManager.default.createDirectory( try FileManager.default.createDirectory(
at: try cacheFileURL.deletingLastPathComponent(), at: cacheFileURL.deletingLastPathComponent(),
withIntermediateDirectories: true, withIntermediateDirectories: true,
attributes: nil attributes: nil
) )
@@ -394,11 +394,8 @@ public final class DataStack {
migrationQueue.name = "com.coreStore.migrationOperationQueue" migrationQueue.name = "com.coreStore.migrationOperationQueue"
migrationQueue.qualityOfService = .utility migrationQueue.qualityOfService = .utility
migrationQueue.underlyingQueue = DispatchQueue( migrationQueue.underlyingQueue = DispatchQueue(
label: "com.coreStore.migrationQueue", serialWith: "com.coreStore.migrationQueue",
qos: .userInitiated, qos: .userInitiated
attributes: .allZeros,
autoreleaseFrequency: .workItem,
target: nil
) )
return migrationQueue return migrationQueue
}() }()
@@ -462,7 +459,7 @@ public final class DataStack {
return returnValue return returnValue
} }
internal func createPersistentStoreFromStorage(_ storage: StorageInterface, finalURL: URL?, finalStoreOptions: [String: AnyObject]?) throws -> NSPersistentStore { internal func createPersistentStoreFromStorage(_ storage: StorageInterface, finalURL: URL?, finalStoreOptions: [AnyHashable: Any]?) throws -> NSPersistentStore {
let persistentStore = try self.coordinator.addPersistentStore( let persistentStore = try self.coordinator.addPersistentStore(
ofType: type(of: storage).storeType, ofType: type(of: storage).storeType,
@@ -85,12 +85,12 @@ public class ICloudStore: CloudStorage {
) )
let fileManager = FileManager.default let fileManager = FileManager.default
guard let cacheFileURL = fileManager.urlForUbiquityContainerIdentifier(ubiquitousContainerID) else { guard let cacheFileURL = fileManager.url(forUbiquityContainerIdentifier: ubiquitousContainerID) else {
return nil return nil
} }
var storeOptions: [String: AnyObject] = [ var storeOptions: [String: Any] = [
NSSQLitePragmasOption: ["journal_mode": "WAL"], NSSQLitePragmasOption: ["journal_mode": "WAL"],
NSPersistentStoreUbiquitousContentNameKey: ubiquitousContentName NSPersistentStoreUbiquitousContentNameKey: ubiquitousContentName
] ]
@@ -265,7 +265,7 @@ public class ICloudStore: CloudStorage {
[NSSQLitePragmasOption: ["journal_mode": "WAL"]] [NSSQLitePragmasOption: ["journal_mode": "WAL"]]
``` ```
*/ */
public let storeOptions: [String: AnyObject]? public let storeOptions: [AnyHashable: Any]?
/** /**
Do not call directly. Used by the `DataStack` internally. Do not call directly. Used by the `DataStack` internally.
@@ -312,7 +312,7 @@ public class ICloudStore: CloudStorage {
NotificationCenter.default.post( NotificationCenter.default.post(
name: notification, name: notification,
object: self, object: self,
userInfo: [String(DataStack.self): dataStack] userInfo: [String(describing: DataStack.self): dataStack]
) )
} }
), ),
@@ -354,7 +354,7 @@ public class ICloudStore: CloudStorage {
NotificationCenter.default.post( NotificationCenter.default.post(
name: notification, name: notification,
object: self, object: self,
userInfo: [String(DataStack.self): dataStack] userInfo: [String(describing: DataStack.self): dataStack]
) )
} }
), ),
@@ -400,7 +400,7 @@ public class ICloudStore: CloudStorage {
/** /**
The options dictionary for the specified `CloudStorageOptions` The options dictionary for the specified `CloudStorageOptions`
*/ */
public func storeOptionsForOptions(_ options: CloudStorageOptions) -> [String: AnyObject]? { public func storeOptionsForOptions(_ options: CloudStorageOptions) -> [AnyHashable: Any]? {
if options == .none { if options == .none {
@@ -453,10 +453,10 @@ public class ICloudStore: CloudStorage {
// MARK: Private // MARK: Private
private struct Static { fileprivate struct Static {
private static var persistentStoreCoordinatorWillChangeStores: Void? fileprivate static var persistentStoreCoordinatorWillChangeStores: Void?
private static var persistentStoreCoordinatorDidChangeStores: Void? fileprivate static var persistentStoreCoordinatorDidChangeStores: Void?
} }
private var willFinishInitialImportKey: Void? private var willFinishInitialImportKey: Void?
@@ -480,7 +480,7 @@ public class ICloudStore: CloudStorage {
guard let `self` = self, guard let `self` = self,
let observer = observer, let observer = observer,
let dataStack = note.userInfo?[String(DataStack.self)] as? DataStack, let dataStack = note.userInfo?[String(describing: DataStack.self)] as? DataStack,
self.dataStack === dataStack else { self.dataStack === dataStack else {
return return
@@ -497,16 +497,16 @@ public class ICloudStore: CloudStorage {
// MARK: - Notification Keys // MARK: - Notification Keys
private extension Notification.Name { fileprivate extension Notification.Name {
private static let iCloudUbiquitousStoreWillFinishInitialImport = Notification.Name(rawValue: "iCloudUbiquitousStoreWillFinishInitialImport") fileprivate static let iCloudUbiquitousStoreWillFinishInitialImport = Notification.Name(rawValue: "iCloudUbiquitousStoreWillFinishInitialImport")
private static let iCloudUbiquitousStoreDidFinishInitialImport = Notification.Name(rawValue: "iCloudUbiquitousStoreDidFinishInitialImport") fileprivate static let iCloudUbiquitousStoreDidFinishInitialImport = Notification.Name(rawValue: "iCloudUbiquitousStoreDidFinishInitialImport")
private static let iCloudUbiquitousStoreWillAddAccount = Notification.Name(rawValue: "iCloudUbiquitousStoreWillAddAccount") fileprivate static let iCloudUbiquitousStoreWillAddAccount = Notification.Name(rawValue: "iCloudUbiquitousStoreWillAddAccount")
private static let iCloudUbiquitousStoreDidAddAccount = Notification.Name(rawValue: "iCloudUbiquitousStoreDidAddAccount") fileprivate static let iCloudUbiquitousStoreDidAddAccount = Notification.Name(rawValue: "iCloudUbiquitousStoreDidAddAccount")
private static let iCloudUbiquitousStoreWillRemoveAccount = Notification.Name(rawValue: "iCloudUbiquitousStoreWillRemoveAccount") fileprivate static let iCloudUbiquitousStoreWillRemoveAccount = Notification.Name(rawValue: "iCloudUbiquitousStoreWillRemoveAccount")
private static let iCloudUbiquitousStoreDidRemoveAccount = Notification.Name(rawValue: "iCloudUbiquitousStoreDidRemoveAccount") fileprivate static let iCloudUbiquitousStoreDidRemoveAccount = Notification.Name(rawValue: "iCloudUbiquitousStoreDidRemoveAccount")
private static let iCloudUbiquitousStoreWillRemoveContent = Notification.Name(rawValue: "iCloudUbiquitousStoreWillRemoveContent") fileprivate static let iCloudUbiquitousStoreWillRemoveContent = Notification.Name(rawValue: "iCloudUbiquitousStoreWillRemoveContent")
private static let iCloudUbiquitousStoreDidRemoveContent = Notification.Name(rawValue: "iCloudUbiquitousStoreDidRemoveContent") fileprivate static let iCloudUbiquitousStoreDidRemoveContent = Notification.Name(rawValue: "iCloudUbiquitousStoreDidRemoveContent")
} }
#endif #endif
@@ -69,7 +69,7 @@ public final class InMemoryStore: StorageInterface, DefaultInitializableStore {
/** /**
The options dictionary for the `NSPersistentStore`. For `InMemoryStore`s, this is always set to `nil`. The options dictionary for the `NSPersistentStore`. For `InMemoryStore`s, this is always set to `nil`.
*/ */
public let storeOptions: [String: AnyObject]? = nil public let storeOptions: [AnyHashable: Any]? = nil
/** /**
Do not call directly. Used by the `DataStack` internally. Do not call directly. Used by the `DataStack` internally.
@@ -63,7 +63,7 @@ public final class LegacySQLiteStore: LocalStorage, DefaultInitializableStore {
*/ */
public init(fileName: String, configuration: String? = nil, mappingModelBundles: [Bundle] = Bundle.allBundles, localStorageOptions: LocalStorageOptions = nil) { public init(fileName: String, configuration: String? = nil, mappingModelBundles: [Bundle] = Bundle.allBundles, localStorageOptions: LocalStorageOptions = nil) {
self.fileURL = try! LegacySQLiteStore.defaultRootDirectory.appendingPathComponent( self.fileURL = LegacySQLiteStore.defaultRootDirectory.appendingPathComponent(
fileName, fileName,
isDirectory: false isDirectory: false
) )
@@ -99,7 +99,7 @@ public final class LegacySQLiteStore: LocalStorage, DefaultInitializableStore {
/** /**
The options dictionary for the specified `LocalStorageOptions` The options dictionary for the specified `LocalStorageOptions`
*/ */
public func storeOptionsForOptions(_ options: LocalStorageOptions) -> [String: AnyObject]? { public func storeOptionsForOptions(_ options: LocalStorageOptions) -> [AnyHashable: Any]? {
if options == .none { if options == .none {
@@ -126,7 +126,7 @@ public final class LegacySQLiteStore: LocalStorage, DefaultInitializableStore {
[NSSQLitePragmasOption: ["journal_mode": "WAL"]] [NSSQLitePragmasOption: ["journal_mode": "WAL"]]
``` ```
*/ */
public let storeOptions: [String: AnyObject]? = [NSSQLitePragmasOption: ["journal_mode": "WAL"]] public let storeOptions: [AnyHashable: Any]? = [NSSQLitePragmasOption: ["journal_mode": "WAL"]]
/** /**
Do not call directly. Used by the `DataStack` internally. Do not call directly. Used by the `DataStack` internally.
@@ -184,12 +184,12 @@ public final class LegacySQLiteStore: LocalStorage, DefaultInitializableStore {
let fileManager = FileManager.default let fileManager = FileManager.default
do { do {
let temporaryFile = try URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!) let temporaryFile = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!)
.appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack", isDirectory: true) .appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack", isDirectory: true)
.appendingPathComponent("trash", isDirectory: true) .appendingPathComponent("trash", isDirectory: true)
.appendingPathComponent(UUID().uuidString, isDirectory: false) .appendingPathComponent(UUID().uuidString, isDirectory: false)
try fileManager.createDirectory( try fileManager.createDirectory(
at: try temporaryFile.deletingLastPathComponent(), at: temporaryFile.deletingLastPathComponent(),
withIntermediateDirectories: true, withIntermediateDirectories: true,
attributes: nil attributes: nil
) )
@@ -217,13 +217,12 @@ public final class LegacySQLiteStore: LocalStorage, DefaultInitializableStore {
let systemDirectorySearchPath = FileManager.SearchPathDirectory.applicationSupportDirectory let systemDirectorySearchPath = FileManager.SearchPathDirectory.applicationSupportDirectory
#endif #endif
return FileManager.default.urlsForDirectory( return FileManager.default.urls(
systemDirectorySearchPath, for: systemDirectorySearchPath,
inDomains: .userDomainMask in: .userDomainMask).first!
).first!
}() }()
internal static let defaultFileURL = try! LegacySQLiteStore.defaultRootDirectory internal static let defaultFileURL = LegacySQLiteStore.defaultRootDirectory
.appendingPathComponent(DataStack.applicationName, isDirectory: false) .appendingPathComponent(DataStack.applicationName, isDirectory: false)
.appendingPathExtension("sqlite") .appendingPathExtension("sqlite")
@@ -62,7 +62,7 @@ public final class SQLiteStore: LocalStorage, DefaultInitializableStore {
*/ */
public init(fileName: String, configuration: String? = nil, mappingModelBundles: [Bundle] = Bundle.allBundles, localStorageOptions: LocalStorageOptions = nil) { public init(fileName: String, configuration: String? = nil, mappingModelBundles: [Bundle] = Bundle.allBundles, localStorageOptions: LocalStorageOptions = nil) {
self.fileURL = try! SQLiteStore.defaultRootDirectory self.fileURL = SQLiteStore.defaultRootDirectory
.appendingPathComponent(fileName, isDirectory: false) .appendingPathComponent(fileName, isDirectory: false)
self.configuration = configuration self.configuration = configuration
self.mappingModelBundles = mappingModelBundles self.mappingModelBundles = mappingModelBundles
@@ -104,7 +104,7 @@ public final class SQLiteStore: LocalStorage, DefaultInitializableStore {
[NSSQLitePragmasOption: ["journal_mode": "WAL"]] [NSSQLitePragmasOption: ["journal_mode": "WAL"]]
``` ```
*/ */
public let storeOptions: [String: AnyObject]? = [NSSQLitePragmasOption: ["journal_mode": "WAL"]] public let storeOptions: [AnyHashable: Any]? = [NSSQLitePragmasOption: ["journal_mode": "WAL"]]
/** /**
Do not call directly. Used by the `DataStack` internally. Do not call directly. Used by the `DataStack` internally.
@@ -143,7 +143,7 @@ public final class SQLiteStore: LocalStorage, DefaultInitializableStore {
/** /**
The options dictionary for the specified `LocalStorageOptions` The options dictionary for the specified `LocalStorageOptions`
*/ */
public func storeOptionsForOptions(_ options: LocalStorageOptions) -> [String: AnyObject]? { public func storeOptionsForOptions(_ options: LocalStorageOptions) -> [AnyHashable: Any]? {
if options == .none { if options == .none {
@@ -181,12 +181,12 @@ public final class SQLiteStore: LocalStorage, DefaultInitializableStore {
let fileManager = FileManager.default let fileManager = FileManager.default
do { do {
let temporaryFile = try URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!) let temporaryFile = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!)
.appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack", isDirectory: true) .appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack", isDirectory: true)
.appendingPathComponent("trash", isDirectory: true) .appendingPathComponent("trash", isDirectory: true)
.appendingPathComponent(UUID().uuidString, isDirectory: false) .appendingPathComponent(UUID().uuidString, isDirectory: false)
try fileManager.createDirectory( try fileManager.createDirectory(
at: try temporaryFile.deletingLastPathComponent(), at: temporaryFile.deletingLastPathComponent(),
withIntermediateDirectories: true, withIntermediateDirectories: true,
attributes: nil attributes: nil
) )
@@ -214,10 +214,11 @@ public final class SQLiteStore: LocalStorage, DefaultInitializableStore {
let systemDirectorySearchPath = FileManager.SearchPathDirectory.applicationSupportDirectory let systemDirectorySearchPath = FileManager.SearchPathDirectory.applicationSupportDirectory
#endif #endif
let defaultSystemDirectory = FileManager.default let defaultSystemDirectory = FileManager.default.urls(
.urlsForDirectory(systemDirectorySearchPath, inDomains: .userDomainMask).first! for: systemDirectorySearchPath,
in: .userDomainMask).first!
return try! defaultSystemDirectory.appendingPathComponent( return defaultSystemDirectory.appendingPathComponent(
Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack", Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack",
isDirectory: true isDirectory: true
) )
@@ -46,7 +46,7 @@ public protocol StorageInterface: class {
/** /**
The options dictionary for the `NSPersistentStore` The options dictionary for the `NSPersistentStore`
*/ */
var storeOptions: [String: AnyObject]? { get } var storeOptions: [AnyHashable: Any]? { get }
// MARK: Internal (Do not call these directly) // MARK: Internal (Do not call these directly)
@@ -153,7 +153,7 @@ public protocol LocalStorage: StorageInterface {
/** /**
The options dictionary for the specified `LocalStorageOptions` The options dictionary for the specified `LocalStorageOptions`
*/ */
func storeOptionsForOptions(_ options: LocalStorageOptions) -> [String: AnyObject]? func storeOptionsForOptions(_ options: LocalStorageOptions) -> [AnyHashable: Any]?
/** /**
Called by the `DataStack` to perform actual deletion of the store file from disk. **Do not call directly!** The `sourceModel` argument is a hint for the existing store's model version. Implementers can use the `sourceModel` to perform necessary store operations. (SQLite stores for example, can convert WAL journaling mode to DELETE before deleting) Called by the `DataStack` to perform actual deletion of the store file from disk. **Do not call directly!** The `sourceModel` argument is a hint for the existing store's model version. Implementers can use the `sourceModel` to perform necessary store operations. (SQLite stores for example, can convert WAL journaling mode to DELETE before deleting)
@@ -237,7 +237,7 @@ public protocol CloudStorage: StorageInterface {
/** /**
The options dictionary for the specified `CloudStorageOptions` The options dictionary for the specified `CloudStorageOptions`
*/ */
func storeOptionsForOptions(_ options: CloudStorageOptions) -> [String: AnyObject]? func storeOptionsForOptions(_ options: CloudStorageOptions) -> [AnyHashable: Any]?
/** /**
Called by the `DataStack` to perform actual deletion of the store file from disk. **Do not call directly!** The `sourceModel` argument is a hint for the existing store's model version. Implementers can use the `sourceModel` to perform necessary store operations. (Cloud stores for example, can set the NSPersistentStoreRemoveUbiquitousMetadataOption option before deleting) Called by the `DataStack` to perform actual deletion of the store file from disk. **Do not call directly!** The `sourceModel` argument is a hint for the existing store's model version. Implementers can use the `sourceModel` to perform necessary store operations. (Cloud stores for example, can set the NSPersistentStoreRemoveUbiquitousMetadataOption option before deleting)
@@ -42,7 +42,7 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
public func commit(_ completion: @escaping (_ result: SaveResult) -> Void = { _ in }) { public func commit(_ completion: @escaping (_ result: SaveResult) -> Void = { _ in }) {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to commit a \(cs_typeName(self)) outside its designated queue." "Attempted to commit a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -69,10 +69,10 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
- returns: a `SaveResult` value indicating success or failure, or `nil` if the transaction was not comitted synchronously - returns: a `SaveResult` value indicating success or failure, or `nil` if the transaction was not comitted synchronously
*/ */
@discardableResult @discardableResult
public func beginSynchronous(_ closure: (_ transaction: SynchronousDataTransaction) -> Void) -> SaveResult? { public func beginSynchronous(_ closure: @escaping (_ transaction: SynchronousDataTransaction) -> Void) -> SaveResult? {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to begin a child transaction from a \(cs_typeName(self)) outside its designated queue." "Attempted to begin a child transaction from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -188,7 +188,7 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
// MARK: Internal // MARK: Internal
internal init(mainContext: NSManagedObjectContext, queue: DispatchQueue, closure: (_ transaction: AsynchronousDataTransaction) -> Void) { internal init(mainContext: NSManagedObjectContext, queue: DispatchQueue, closure: @escaping (_ transaction: AsynchronousDataTransaction) -> Void) {
self.closure = closure self.closure = closure
@@ -199,7 +199,7 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
self.transactionQueue.async { self.transactionQueue.async {
self.closure(transaction: self) self.closure(self)
if !self.isCommitted && self.hasChanges { if !self.isCommitted && self.hasChanges {
CoreStore.log( CoreStore.log(
@@ -214,7 +214,7 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
self.transactionQueue.sync { self.transactionQueue.sync {
self.closure(transaction: self) self.closure(self)
if !self.isCommitted && self.hasChanges { if !self.isCommitted && self.hasChanges {
+13 -13
View File
@@ -219,7 +219,7 @@ public /*abstract*/ class BaseDataTransaction {
public func insertedObjects() -> Set<NSManagedObject> { public func insertedObjects() -> Set<NSManagedObject> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access inserted objects from a \(cs_typeName(self)) outside its designated queue." "Attempted to access inserted objects from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -239,7 +239,7 @@ public /*abstract*/ class BaseDataTransaction {
public func insertedObjects<T: NSManagedObject>(_ entity: T.Type) -> Set<T> { public func insertedObjects<T: NSManagedObject>(_ entity: T.Type) -> Set<T> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access inserted objects from a \(cs_typeName(self)) outside its designated queue." "Attempted to access inserted objects from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -258,7 +258,7 @@ public /*abstract*/ class BaseDataTransaction {
public func insertedObjectIDs() -> Set<NSManagedObjectID> { public func insertedObjectIDs() -> Set<NSManagedObjectID> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access inserted object IDs from a \(cs_typeName(self)) outside its designated queue." "Attempted to access inserted object IDs from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -278,7 +278,7 @@ public /*abstract*/ class BaseDataTransaction {
public func insertedObjectIDs<T: NSManagedObject>(_ entity: T.Type) -> Set<NSManagedObjectID> { public func insertedObjectIDs<T: NSManagedObject>(_ entity: T.Type) -> Set<NSManagedObjectID> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access inserted object IDs from a \(cs_typeName(self)) outside its designated queue." "Attempted to access inserted object IDs from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -297,7 +297,7 @@ public /*abstract*/ class BaseDataTransaction {
public func updatedObjects() -> Set<NSManagedObject> { public func updatedObjects() -> Set<NSManagedObject> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access updated objects from a \(cs_typeName(self)) outside its designated queue." "Attempted to access updated objects from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -317,7 +317,7 @@ public /*abstract*/ class BaseDataTransaction {
public func updatedObjects<T: NSManagedObject>(_ entity: T.Type) -> Set<T> { public func updatedObjects<T: NSManagedObject>(_ entity: T.Type) -> Set<T> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access updated objects from a \(cs_typeName(self)) outside its designated queue." "Attempted to access updated objects from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -336,7 +336,7 @@ public /*abstract*/ class BaseDataTransaction {
public func updatedObjectIDs() -> Set<NSManagedObjectID> { public func updatedObjectIDs() -> Set<NSManagedObjectID> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access updated object IDs from a \(cs_typeName(self)) outside its designated queue." "Attempted to access updated object IDs from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -356,7 +356,7 @@ public /*abstract*/ class BaseDataTransaction {
public func updatedObjectIDs<T: NSManagedObject>(_ entity: T.Type) -> Set<NSManagedObjectID> { public func updatedObjectIDs<T: NSManagedObject>(_ entity: T.Type) -> Set<NSManagedObjectID> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access updated object IDs from a \(cs_typeName(self)) outside its designated queue." "Attempted to access updated object IDs from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -375,7 +375,7 @@ public /*abstract*/ class BaseDataTransaction {
public func deletedObjects() -> Set<NSManagedObject> { public func deletedObjects() -> Set<NSManagedObject> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access deleted objects from a \(cs_typeName(self)) outside its designated queue." "Attempted to access deleted objects from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -395,7 +395,7 @@ public /*abstract*/ class BaseDataTransaction {
public func deletedObjects<T: NSManagedObject>(_ entity: T.Type) -> Set<T> { public func deletedObjects<T: NSManagedObject>(_ entity: T.Type) -> Set<T> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access deleted objects from a \(cs_typeName(self)) outside its designated queue." "Attempted to access deleted objects from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -415,7 +415,7 @@ public /*abstract*/ class BaseDataTransaction {
public func deletedObjectIDs() -> Set<NSManagedObjectID> { public func deletedObjectIDs() -> Set<NSManagedObjectID> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access deleted object IDs from a \(cs_typeName(self)) outside its designated queue." "Attempted to access deleted object IDs from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -435,7 +435,7 @@ public /*abstract*/ class BaseDataTransaction {
public func deletedObjectIDs<T: NSManagedObject>(_ entity: T.Type) -> Set<NSManagedObjectID> { public func deletedObjectIDs<T: NSManagedObject>(_ entity: T.Type) -> Set<NSManagedObjectID> {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to access deleted object IDs from a \(cs_typeName(self)) outside its designated queue." "Attempted to access deleted object IDs from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -484,6 +484,6 @@ public /*abstract*/ class BaseDataTransaction {
internal func isRunningInAllowedQueue() -> Bool { internal func isRunningInAllowedQueue() -> Bool {
return self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext() return self.bypassesQueueing || self.transactionQueue.cs_isCurrentExecutionContext()
} }
} }
@@ -35,7 +35,7 @@ public extension CoreStore {
- parameter closure: the block where creates, updates, and deletes can be made to the transaction. Transaction blocks are executed serially in a background queue, and all changes are made from a concurrent `NSManagedObjectContext`. - parameter closure: the block where creates, updates, and deletes can be made to the transaction. Transaction blocks are executed serially in a background queue, and all changes are made from a concurrent `NSManagedObjectContext`.
*/ */
public static func beginAsynchronous(_ closure: (_ transaction: AsynchronousDataTransaction) -> Void) { public static func beginAsynchronous(_ closure: @escaping (_ transaction: AsynchronousDataTransaction) -> Void) {
self.defaultStack.beginAsynchronous(closure) self.defaultStack.beginAsynchronous(closure)
} }
@@ -47,7 +47,7 @@ public extension CoreStore {
- returns: a `SaveResult` value indicating success or failure, or `nil` if the transaction was not comitted synchronously - returns: a `SaveResult` value indicating success or failure, or `nil` if the transaction was not comitted synchronously
*/ */
@discardableResult @discardableResult
public static func beginSynchronous(_ closure: (_ transaction: SynchronousDataTransaction) -> Void) -> SaveResult? { public static func beginSynchronous(_ closure: @escaping (_ transaction: SynchronousDataTransaction) -> Void) -> SaveResult? {
return self.defaultStack.beginSynchronous(closure) return self.defaultStack.beginSynchronous(closure)
} }
@@ -36,7 +36,7 @@ public extension DataStack {
- parameter closure: the block where creates, updates, and deletes can be made to the transaction. Transaction blocks are executed serially in a background queue, and all changes are made from a concurrent `NSManagedObjectContext`. - parameter closure: the block where creates, updates, and deletes can be made to the transaction. Transaction blocks are executed serially in a background queue, and all changes are made from a concurrent `NSManagedObjectContext`.
*/ */
public func beginAsynchronous(_ closure: (_ transaction: AsynchronousDataTransaction) -> Void) { public func beginAsynchronous(_ closure: @escaping (_ transaction: AsynchronousDataTransaction) -> Void) {
AsynchronousDataTransaction( AsynchronousDataTransaction(
mainContext: self.rootSavingContext, mainContext: self.rootSavingContext,
@@ -51,7 +51,7 @@ public extension DataStack {
- returns: a `SaveResult` value indicating success or failure, or `nil` if the transaction was not comitted synchronously - returns: a `SaveResult` value indicating success or failure, or `nil` if the transaction was not comitted synchronously
*/ */
@discardableResult @discardableResult
public func beginSynchronous(_ closure: (_ transaction: SynchronousDataTransaction) -> Void) -> SaveResult? { public func beginSynchronous(_ closure: @escaping (_ transaction: SynchronousDataTransaction) -> Void) -> SaveResult? {
return SynchronousDataTransaction( return SynchronousDataTransaction(
mainContext: self.rootSavingContext, mainContext: self.rootSavingContext,
@@ -69,9 +69,9 @@ public extension DataStack {
return UnsafeDataTransaction( return UnsafeDataTransaction(
mainContext: self.rootSavingContext, mainContext: self.rootSavingContext,
queue: .createSerial( queue: DispatchQueue(
"com.coreStore.dataStack.unsafeTransactionQueue", serialWith: "com.coreStore.dataStack.unsafeTransactionQueue",
targetQueue: .userInitiated qos: .userInitiated
), ),
supportsUndo: supportsUndo supportsUndo: supportsUndo
) )
@@ -50,7 +50,7 @@ public extension NSManagedObject {
@nonobjc @nonobjc
internal class func createInContext(_ context: NSManagedObjectContext) -> Self { internal class func createInContext(_ context: NSManagedObjectContext) -> Self {
return self.`init`(entity:insertInto:)( return self.init(
entity: context.entityDescriptionForEntityType(self)!, entity: context.entityDescriptionForEntityType(self)!,
insertInto: context insertInto: context
) )
@@ -42,7 +42,7 @@ public final class SynchronousDataTransaction: BaseDataTransaction {
public func commitAndWait() -> SaveResult { public func commitAndWait() -> SaveResult {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to commit a \(cs_typeName(self)) outside its designated queue." "Attempted to commit a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -64,10 +64,10 @@ public final class SynchronousDataTransaction: BaseDataTransaction {
- returns: a `SaveResult` value indicating success or failure, or `nil` if the transaction was not comitted synchronously - returns: a `SaveResult` value indicating success or failure, or `nil` if the transaction was not comitted synchronously
*/ */
@discardableResult @discardableResult
public func beginSynchronous(_ closure: (_ transaction: SynchronousDataTransaction) -> Void) -> SaveResult? { public func beginSynchronous(_ closure: @escaping (_ transaction: SynchronousDataTransaction) -> Void) -> SaveResult? {
CoreStore.assert( CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(), self.transactionQueue.cs_isCurrentExecutionContext(),
"Attempted to begin a child transaction from a \(cs_typeName(self)) outside its designated queue." "Attempted to begin a child transaction from a \(cs_typeName(self)) outside its designated queue."
) )
CoreStore.assert( CoreStore.assert(
@@ -183,7 +183,7 @@ public final class SynchronousDataTransaction: BaseDataTransaction {
// MARK: Internal // MARK: Internal
internal init(mainContext: NSManagedObjectContext, queue: DispatchQueue, closure: (_ transaction: SynchronousDataTransaction) -> Void) { internal init(mainContext: NSManagedObjectContext, queue: DispatchQueue, closure: @escaping (_ transaction: SynchronousDataTransaction) -> Void) {
self.closure = closure self.closure = closure
@@ -194,7 +194,7 @@ public final class SynchronousDataTransaction: BaseDataTransaction {
self.transactionQueue.sync { self.transactionQueue.sync {
self.closure(transaction: self) self.closure(self)
if !self.isCommitted && self.hasChanges { if !self.isCommitted && self.hasChanges {