diff --git a/Source/Classes/Fetch/SubOperations/RecordToCoreDataOperation.swift b/Source/Classes/Fetch/SubOperations/RecordToCoreDataOperation.swift index bbc99627..f537c65e 100644 --- a/Source/Classes/Fetch/SubOperations/RecordToCoreDataOperation.swift +++ b/Source/Classes/Fetch/SubOperations/RecordToCoreDataOperation.swift @@ -78,7 +78,20 @@ class RecordToCoreDataOperation: AsynchronousOperation { let attribute = CloudKitAttribute(value: recordValue, fieldName: key, entityName: entityName, serviceAttributes: serviceAttributeNames, context: context) let coreDataValue = try attribute.makeCoreDataValue() - object.setValue(coreDataValue, forKey: key) + + if let attribute = object.entity.attributesByName[key], attribute.attributeType == .transformableAttributeType, + let data = coreDataValue as? Data { + if let name = attribute.valueTransformerName, let transformer = ValueTransformer(forName: NSValueTransformerName(rawValue: name)) { + let value = transformer.transformedValue(coreDataValue) + object.setValue(value, forKey: key) + } else if let unarchivedObject = NSKeyedUnarchiver.unarchiveObject(with: data) { + object.setValue(unarchivedObject, forKey: key) + } else { + object.setValue(coreDataValue, forKey: key) + } + } else { + object.setValue(coreDataValue, forKey: key) + } } // Set system headers diff --git a/Source/Classes/Save/ObjectToRecord/CoreDataAttribute.swift b/Source/Classes/Save/ObjectToRecord/CoreDataAttribute.swift index cf7dd05f..2c7aa848 100644 --- a/Source/Classes/Save/ObjectToRecord/CoreDataAttribute.swift +++ b/Source/Classes/Save/ObjectToRecord/CoreDataAttribute.swift @@ -23,14 +23,22 @@ class CoreDataAttribute { // it is not an attribute return nil } - - self.description = description + + self.description = description if value is NSNull { self.value = nil - } else { - self.value = value - } + } else if let attribute = entity.attributesByName[attributeName], + attribute.attributeType == .transformableAttributeType { + if let transformerName = attribute.valueTransformerName, + let transformer = ValueTransformer(forName: NSValueTransformerName(rawValue: transformerName)) { + self.value = transformer.reverseTransformedValue(value) + } else { + self.value = NSKeyedArchiver.archivedData(withRootObject: value) + } + } else { + self.value = value + } self.name = attributeName }