diff --git a/iOSDemo/Cartfile.resolved b/iOSDemo/Cartfile.resolved index c292f9d9..fdaadcef 100644 --- a/iOSDemo/Cartfile.resolved +++ b/iOSDemo/Cartfile.resolved @@ -1,3 +1,3 @@ -github "3lvis/Networking" "4.1.1" -github "3lvis/Sync" "4.0.3" -github "Alamofire/Alamofire" "4.5.1" +github "3lvis/Networking" "4.2.0" +github "3lvis/Sync" "4.1.1" +github "Alamofire/Alamofire" "4.6.0" diff --git a/iOSDemo/Carthage/Build/.Alamofire.version b/iOSDemo/Carthage/Build/.Alamofire.version index 492eff93..25a977c5 100644 --- a/iOSDemo/Carthage/Build/.Alamofire.version +++ b/iOSDemo/Carthage/Build/.Alamofire.version @@ -1,9 +1,27 @@ { - "commitish" : "4.5.1", + "Mac" : [ + { + "name" : "Alamofire", + "hash" : "a8b6c2767233f8d050a976027721a3499b754242ae464ad61372d905490d2d7a" + } + ], + "watchOS" : [ + { + "name" : "Alamofire", + "hash" : "2e051ade20bec88646730660fcbfc290453ae9676e7ee11dcd9468aad3939dc0" + } + ], + "tvOS" : [ + { + "name" : "Alamofire", + "hash" : "7d7d3b2135a35045e2007a367591be85b00e1723cd8e8bf029786818b1d84aeb" + } + ], + "commitish" : "4.6.0", "iOS" : [ { "name" : "Alamofire", - "hash" : "359195014cabb582d7ba0f68eb9bd1432ff47275d3c7a4d47859331bb40bd8c6" + "hash" : "95edb1d90081cd504de2507ce2907da9e4b6c160c4cc614a03bd662d19a6bc7d" } ] } \ No newline at end of file diff --git a/iOSDemo/Carthage/Build/.Networking.version b/iOSDemo/Carthage/Build/.Networking.version index 08e94cdd..f2ac8bde 100644 --- a/iOSDemo/Carthage/Build/.Networking.version +++ b/iOSDemo/Carthage/Build/.Networking.version @@ -2,26 +2,26 @@ "Mac" : [ { "name" : "Networking", - "hash" : "63bda7f65926d32ed8b9cdfc258479da58b9a7a534a122ba6ffa72e6f60b536d" + "hash" : "80f1e9435992856e60a0b45e47cf2586e21ea661744babe389b8c332d6a1504e" } ], "watchOS" : [ { "name" : "Networking", - "hash" : "9190165887b5b42687394ca2051b83c9e30d4f9ed4cd11c3822eaf9015540226" + "hash" : "617dc58efad4ac03a9a4fd9ddedb817d8dcb61c9a070fbafbd7010fd59feaa09" } ], "tvOS" : [ { "name" : "Networking", - "hash" : "226e0553d2700b3789d1920e756cf2279059ee40de19146c00aa3746e26fba7a" + "hash" : "06eac35f21c5db103bfcad3e008166b506674047ed5d8a6add1714c802903644" } ], - "commitish" : "4.1.1", + "commitish" : "4.2.0", "iOS" : [ { "name" : "Networking", - "hash" : "de1327dad50ea73e2b471d3a84f4ba33698ee34960ca26cc163f50dd0c4442a8" + "hash" : "cc80f9927ef6576a0cddc8929e2ce9ec8819ad45139c5876d9cf023dca4e61cd" } ] } \ No newline at end of file diff --git a/iOSDemo/Carthage/Build/.Sync.version b/iOSDemo/Carthage/Build/.Sync.version index 85115ace..cef2d1da 100644 --- a/iOSDemo/Carthage/Build/.Sync.version +++ b/iOSDemo/Carthage/Build/.Sync.version @@ -1,9 +1,27 @@ { - "commitish" : "4.0.3", + "Mac" : [ + { + "name" : "Sync", + "hash" : "2797183da7448fff5975a0d2b4894ff2c3c47f72f0759f941b2fc5e40dbfd2ce" + } + ], + "watchOS" : [ + { + "name" : "Sync", + "hash" : "b52728199d34be073b8d34e7d7a5cb570b73b64d79afd3a7b05e99cf390f9261" + } + ], + "tvOS" : [ + { + "name" : "Sync", + "hash" : "21295409eb17d8c8bb1b5ca037afcb337dad84f58b51e54a2c2f2c04a44cb8a4" + } + ], + "commitish" : "4.1.1", "iOS" : [ { "name" : "Sync", - "hash" : "e38ddb444826f90a823d94710bd0fc4f5a9b6fed2093647118bd03cd5e18479e" + "hash" : "64d3d524ac7e11d4db22fd21e656e296f0289b69d41cbe5205ad70b1ac7156e2" } ] } \ No newline at end of file diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework.dSYM/Contents/Info.plist b/iOSDemo/Carthage/Build/iOS/Alamofire.framework.dSYM/Contents/Info.plist index 7a61759b..849c8dc0 100644 --- a/iOSDemo/Carthage/Build/iOS/Alamofire.framework.dSYM/Contents/Info.plist +++ b/iOSDemo/Carthage/Build/iOS/Alamofire.framework.dSYM/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleShortVersionString - 4.5.1 + 4.6.0 CFBundleVersion 1 diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework.dSYM/Contents/Resources/DWARF/Alamofire b/iOSDemo/Carthage/Build/iOS/Alamofire.framework.dSYM/Contents/Resources/DWARF/Alamofire index d3ef3136..860f9772 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework.dSYM/Contents/Resources/DWARF/Alamofire and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework.dSYM/Contents/Resources/DWARF/Alamofire differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Alamofire b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Alamofire index dadea54e..ad1dff8e 100755 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Alamofire and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Alamofire differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Headers/Alamofire-Swift.h b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Headers/Alamofire-Swift.h index 034ddaa9..2fd267da 100644 --- a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Headers/Alamofire-Swift.h +++ b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Headers/Alamofire-Swift.h @@ -1,4 +1,4 @@ -// Generated by Apple Swift version 4.0.2 effective-3.2.2 (swiftlang-900.0.69.2 clang-900.0.38) +// Generated by Apple Swift version 4.0.3 effective-3.2.3 (swiftlang-900.0.74.1 clang-900.0.39.2) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgcc-compat" diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Info.plist b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Info.plist index 60cd7fb0..452393f3 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Info.plist and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Info.plist differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm.swiftdoc b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm.swiftdoc index 7318a117..7c2acdbd 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm.swiftmodule b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm.swiftmodule index d6fb3dd9..2eebc1f1 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm64.swiftdoc b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm64.swiftdoc index c5910dd8..4a389392 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm64.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm64.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm64.swiftmodule b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm64.swiftmodule index b334a3ae..df3fc8af 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm64.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/arm64.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/i386.swiftdoc b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/i386.swiftdoc index 6899ec3f..88965b07 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/i386.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/i386.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/i386.swiftmodule b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/i386.swiftmodule index 6ca56faf..1a46859c 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/i386.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/i386.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftdoc b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftdoc index 3de50ba6..6d851deb 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftmodule b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftmodule index 79187abf..b082e062 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework.dSYM/Contents/Resources/DWARF/Networking b/iOSDemo/Carthage/Build/iOS/Networking.framework.dSYM/Contents/Resources/DWARF/Networking index 9f6abd50..c93dcea5 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework.dSYM/Contents/Resources/DWARF/Networking and b/iOSDemo/Carthage/Build/iOS/Networking.framework.dSYM/Contents/Resources/DWARF/Networking differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Headers/Networking-Swift.h b/iOSDemo/Carthage/Build/iOS/Networking.framework/Headers/Networking-Swift.h index ef1a170b..c4b169e0 100644 --- a/iOSDemo/Carthage/Build/iOS/Networking.framework/Headers/Networking-Swift.h +++ b/iOSDemo/Carthage/Build/iOS/Networking.framework/Headers/Networking-Swift.h @@ -1,4 +1,4 @@ -// Generated by Apple Swift version 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38) +// Generated by Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgcc-compat" diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Info.plist b/iOSDemo/Carthage/Build/iOS/Networking.framework/Info.plist index 14f0d134..10e3e7b9 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Info.plist and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Info.plist differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm.swiftdoc b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm.swiftdoc index cb8078c1..d55cf3d9 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm.swiftmodule b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm.swiftmodule index f5f6b8e8..64d96991 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm64.swiftdoc b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm64.swiftdoc index 5060e832..93449547 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm64.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm64.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm64.swiftmodule b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm64.swiftmodule index dd10f8bf..6f8f0375 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm64.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/arm64.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/i386.swiftdoc b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/i386.swiftdoc index a385fe58..c16b8abc 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/i386.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/i386.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/i386.swiftmodule b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/i386.swiftmodule index f0982e65..835a6289 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/i386.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/i386.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/x86_64.swiftdoc b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/x86_64.swiftdoc index 86fae571..a3cfbc6c 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/x86_64.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/x86_64.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/x86_64.swiftmodule b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/x86_64.swiftmodule index a352aa59..6cda7e81 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/x86_64.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Modules/Networking.swiftmodule/x86_64.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Networking.framework/Networking b/iOSDemo/Carthage/Build/iOS/Networking.framework/Networking index 07dc429f..f169f0e2 100755 Binary files a/iOSDemo/Carthage/Build/iOS/Networking.framework/Networking and b/iOSDemo/Carthage/Build/iOS/Networking.framework/Networking differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework.dSYM/Contents/Resources/DWARF/Sync b/iOSDemo/Carthage/Build/iOS/Sync.framework.dSYM/Contents/Resources/DWARF/Sync index 8d5153be..8364fc46 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework.dSYM/Contents/Resources/DWARF/Sync and b/iOSDemo/Carthage/Build/iOS/Sync.framework.dSYM/Contents/Resources/DWARF/Sync differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/DataStack.swift b/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/DataStack.swift index a25f39a6..3f454bd3 100755 --- a/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/DataStack.swift +++ b/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/DataStack.swift @@ -27,6 +27,8 @@ import CoreData private var containerURL = URL.directoryURL() + private let backgroundContextName = "DataStack.backgroundContextName" + /** The context for the main queue. Please do not use this to mutate data, use `performInNewBackgroundContext` instead. @@ -232,6 +234,7 @@ import CoreData */ @objc public func newBackgroundContext() -> NSManagedObjectContext { let context = NSManagedObjectContext(concurrencyType: DataStack.backgroundConcurrencyType()) + context.name = backgroundContextName context.persistentStoreCoordinator = self.persistentStoreCoordinator context.undoManager = nil context.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy @@ -373,6 +376,11 @@ import CoreData // Can't be private, has to be internal in order to be used as a selector. @objc func backgroundContextDidSave(_ notification: Notification) throws { + let context = notification.object as? NSManagedObjectContext + guard context?.name == backgroundContextName else { + return + } + if Thread.isMainThread && TestCheck.isTesting == false { throw NSError(info: "Background context saved in the main thread. Use context's `performBlock`", previousError: nil) } else { diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/NSManagedObject+Sync.swift b/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/NSManagedObject+Sync.swift index 2d9b1010..f37e989e 100644 --- a/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/NSManagedObject+Sync.swift +++ b/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/NSManagedObject+Sync.swift @@ -186,14 +186,21 @@ extension NSManagedObject { } } - /** - Syncs the entity's to-many relationship, it will also sync the childs of this relationship. - - parameter relationship: The relationship to be synced. - - parameter dictionary: The JSON with the changes to be applied to the entity. - - parameter parent: The parent of the entity, optional since many entities are orphans. - - parameter dataStack: The DataStack instance. - */ + /// Syncs the entity's to-many relationship, it will also sync the childs of this relationship. + /// + /// - Parameters: + /// - relationship: The relationship to be synced. + /// - dictionary: The JSON with the changes to be applied to the entity. + /// - parent: The parent of the entity, optional since many entities are orphans. + /// - parentRelationship: The relationship from which the parent was referenced. + /// - context: The NSManagedContext involving the current Core Data operation. + /// - operations: The Sync.Operation options to be used for this operation. + /// - shouldContinueBlock: A block that checks wheter the Sync process should continue to the next element or stop. This is used in conjunction to operations, if the operation is cancelled the Sync process will stop. + /// - objectJSONBlock: A block that gives the oportunity to the called to act on the current processed JSON. + /// - Throws: An exception that will throw if any of the underlaying operations fail. func sync_toManyRelationship(_ relationship: NSRelationshipDescription, dictionary: [String: Any], parent: NSManagedObject?, parentRelationship: NSRelationshipDescription?, context: NSManagedObjectContext, operations: Sync.OperationOptions, shouldContinueBlock: (() -> Bool)?, objectJSONBlock: ((_ objectJSON: [String: Any]) -> [String: Any])?) throws { + let updatedOperations = operations.relationshipOperations() + var children: [[String: Any]]? let childrenIsNull = (relationship.customKey as Any?) is NSNull || dictionary[relationship.name.hyp_snakeCase()] is NSNull || dictionary[relationship.name] is NSNull if childrenIsNull { @@ -223,7 +230,6 @@ extension NSManagedObject { } let inverseIsToMany = relationship.inverseRelationship?.isToMany ?? false - guard let managedObjectContext = managedObjectContext else { abort() } guard let destinationEntity = relationship.destinationEntity else { abort() } guard let childEntityName = destinationEntity.name else { abort() } @@ -254,7 +260,7 @@ extension NSManagedObject { var safeLocalObjects: [NSManagedObject]? if deletedItems.count > 0 { - safeLocalObjects = try managedObjectContext.fetch(request) as? [NSManagedObject] ?? [NSManagedObject]() + safeLocalObjects = try context.fetch(request) as? [NSManagedObject] ?? [NSManagedObject]() for safeObject in safeLocalObjects! { let currentID = safeObject.value(forKey: safeObject.entity.sync_localPrimaryKey())! for deleted in deletedItems { @@ -282,7 +288,7 @@ extension NSManagedObject { if let safeLocalObjects = safeLocalObjects { objects = safeLocalObjects } else { - objects = try managedObjectContext.fetch(request) as? [NSManagedObject] ?? [NSManagedObject]() + objects = try context.fetch(request) as? [NSManagedObject] ?? [NSManagedObject]() } for safeObject in objects { let currentID = safeObject.value(forKey: safeObject.entity.sync_localPrimaryKey())! @@ -300,20 +306,26 @@ extension NSManagedObject { var childPredicate: NSPredicate? let manyToMany = inverseIsToMany && relationship.isToMany - var childOperations = operations + var childOperations = updatedOperations if manyToMany { childOperations.remove(.delete) if ((childIDs as Any) as AnyObject).count > 0 { - guard let entity = NSEntityDescription.entity(forEntityName: childEntityName, in: managedObjectContext) else { fatalError() } + guard let entity = NSEntityDescription.entity(forEntityName: childEntityName, in: context) else { fatalError() } guard let childIDsObject = childIDs as? NSObject else { fatalError() } childPredicate = NSPredicate(format: "ANY %K IN %@", entity.sync_localPrimaryKey(), childIDsObject) } } else { guard let inverseEntityName = relationship.inverseRelationship?.name else { fatalError() } childPredicate = NSPredicate(format: "%K = %@", inverseEntityName, self) + + if ((childIDs as Any) as AnyObject).count > 0 { + guard let entity = NSEntityDescription.entity(forEntityName: childEntityName, in: context) else { fatalError() } + guard let childIDsObject = childIDs as? NSObject else { fatalError() } + childPredicate = NSPredicate(format: "ANY %K IN %@ OR %K = %@", entity.sync_localPrimaryKey(), childIDsObject, inverseEntityName, self) + } } - try Sync.changes(children, inEntityNamed: childEntityName, predicate: childPredicate, parent: self, parentRelationship: relationship, inContext: managedObjectContext, operations: childOperations, shouldContinueBlock: shouldContinueBlock, objectJSONBlock: objectJSONBlock) + try Sync.changes(children, inEntityNamed: childEntityName, predicate: childPredicate, parent: self, parentRelationship: relationship, inContext: context, operations: childOperations, shouldContinueBlock: shouldContinueBlock, objectJSONBlock: objectJSONBlock) } else { var destinationIsParentSuperEntity = false if let parent = parent, let destinationEntityName = relationship.destinationEntity?.name { @@ -379,6 +391,7 @@ extension NSManagedObject { */ func sync_toOneRelationship(_ relationship: NSRelationshipDescription, dictionary: [String: Any], context: NSManagedObjectContext, operations: Sync.OperationOptions, shouldContinueBlock: (() -> Bool)?, objectJSONBlock: ((_ objectJSON: [String: Any]) -> [String: Any])?) { var filteredObjectDictionary: [String: Any]? + var jsonContainsRelationship = false if let customRelationshipName = relationship.customKey { if customRelationshipName.contains(".") { @@ -386,11 +399,13 @@ extension NSManagedObject { if let rootObject = dictionary[deepMappingRootKey] as? [String: Any] { if let deepMappingLeaveKey = customRelationshipName.components(separatedBy: ".").last { filteredObjectDictionary = rootObject[deepMappingLeaveKey] as? [String: Any] + jsonContainsRelationship = rootObject[deepMappingLeaveKey] != nil } } } } else { filteredObjectDictionary = dictionary[customRelationshipName] as? [String: Any] + jsonContainsRelationship = dictionary[customRelationshipName] != nil } } else if let result = dictionary[relationship.name.hyp_snakeCase()] as? [String: Any] { filteredObjectDictionary = result @@ -398,6 +413,11 @@ extension NSManagedObject { filteredObjectDictionary = result } + // Check if the JSON contains key, so we know if we should delete null values + if !jsonContainsRelationship { + jsonContainsRelationship = dictionary[relationship.name.hyp_snakeCase()] != nil || dictionary[relationship.name] != nil + } + if let toOneObjectDictionary = filteredObjectDictionary { guard let managedObjectContext = self.managedObjectContext else { return } guard let destinationEntity = relationship.destinationEntity else { return } @@ -413,7 +433,7 @@ extension NSManagedObject { if currentRelationship == nil || !(currentRelationship! as AnyObject).isEqual(object) { setValue(object, forKey: relationship.name) } - } else { + } else if jsonContainsRelationship { let currentRelationship = self.value(forKey: relationship.name) if currentRelationship != nil { setValue(nil, forKey: relationship.name) diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/Sync-Swift.h b/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/Sync-Swift.h index 97d79ab3..200f3a64 100644 --- a/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/Sync-Swift.h +++ b/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/Sync-Swift.h @@ -1,4 +1,4 @@ -// Generated by Apple Swift version 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38) +// Generated by Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgcc-compat" diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/Sync.swift b/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/Sync.swift index 67216472..c7fde3d4 100644 --- a/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/Sync.swift +++ b/iOSDemo/Carthage/Build/iOS/Sync.framework/Headers/Sync.swift @@ -27,7 +27,28 @@ public protocol SyncDelegate: class { public static let insert = OperationOptions(rawValue: 1 << 0) public static let update = OperationOptions(rawValue: 1 << 1) public static let delete = OperationOptions(rawValue: 1 << 2) - public static let all: OperationOptions = [.insert, .update, .delete] + public static let insertRelationships = OperationOptions(rawValue: 1 << 3) + public static let updateRelationships = OperationOptions(rawValue: 1 << 4) + public static let deleteRelationships = OperationOptions(rawValue: 1 << 5) + public static let all: OperationOptions = [.insert, .update, .delete, .insertRelationships, .updateRelationships, .deleteRelationships] + + func relationshipOperations() -> OperationOptions { + var options = OperationOptions.all + + if !self.contains(.insertRelationships) { + options.remove(.insert) + } + + if !self.contains(.updateRelationships) { + options.remove(.update) + } + + if !self.contains(.deleteRelationships) { + options.remove(.delete) + } + + return options + } } var downloadFinished = false diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Info.plist b/iOSDemo/Carthage/Build/iOS/Sync.framework/Info.plist index 6d6a3fd4..a8934227 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Info.plist and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Info.plist differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm.swiftdoc b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm.swiftdoc index 43c66716..6ecf895c 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm.swiftmodule b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm.swiftmodule index ec81a430..e113969c 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm64.swiftdoc b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm64.swiftdoc index 026374ff..aac19591 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm64.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm64.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm64.swiftmodule b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm64.swiftmodule index 4817da53..c19f1475 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm64.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/arm64.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/i386.swiftdoc b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/i386.swiftdoc index 241b46bf..d2f296ab 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/i386.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/i386.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/i386.swiftmodule b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/i386.swiftmodule index 78e1288f..eecaf964 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/i386.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/i386.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/x86_64.swiftdoc b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/x86_64.swiftdoc index 9418526f..aa14775b 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/x86_64.swiftdoc and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/x86_64.swiftdoc differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/x86_64.swiftmodule b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/x86_64.swiftmodule index ea3b08f8..cb4767ff 100644 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/x86_64.swiftmodule and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Modules/Sync.swiftmodule/x86_64.swiftmodule differ diff --git a/iOSDemo/Carthage/Build/iOS/Sync.framework/Sync b/iOSDemo/Carthage/Build/iOS/Sync.framework/Sync index 75b37957..32b93bb4 100755 Binary files a/iOSDemo/Carthage/Build/iOS/Sync.framework/Sync and b/iOSDemo/Carthage/Build/iOS/Sync.framework/Sync differ