diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..ab24215 Binary files /dev/null and b/.DS_Store differ diff --git a/MTLManagedObjectAdapter/MTLManagedObjectAdapter.h b/MTLManagedObjectAdapter/MTLManagedObjectAdapter.h index dfefb20..7060d6a 100644 --- a/MTLManagedObjectAdapter/MTLManagedObjectAdapter.h +++ b/MTLManagedObjectAdapter/MTLManagedObjectAdapter.h @@ -107,6 +107,9 @@ FOUNDATION_EXPORT const unsigned char MTLManagedObjectAdapterVersionString[]; // be used. + (NSDictionary *)relationshipModelClassesByPropertyKey; +// similar with relationshipModelClassesByPropertyKey ++ (NSDictionary *)fetchedPropertyModelClassesByPropertyKey; + // Overridden to deserialize a different class instead of the receiver, based on // information in the provided object. // diff --git a/MTLManagedObjectAdapter/MTLManagedObjectAdapter.m b/MTLManagedObjectAdapter/MTLManagedObjectAdapter.m index 3a3189f..d1c645e 100644 --- a/MTLManagedObjectAdapter/MTLManagedObjectAdapter.m +++ b/MTLManagedObjectAdapter/MTLManagedObjectAdapter.m @@ -10,8 +10,8 @@ #import -#import "EXTScope.h" -#import "EXTRuntimeExtensions.h" +#import "mtl_moa_EXTScope.h" +#import "mtl_moa_EXTRuntimeExtensions.h" #import "MTLManagedObjectAdapter.h" @@ -64,6 +64,9 @@ @interface MTLManagedObjectAdapter () // A cached copy of the return value of +relationshipModelClassesByPropertyKey. @property (nonatomic, copy, readonly) NSDictionary *relationshipModelClassesByPropertyKey; +// A cached copy of the return value of +fetchedPropertyModelClassesByPropertyKey. +@property (nonatomic, copy, readonly) NSDictionary *fetchedPropertyModelClassesByPropertyKey; + // A cache of the return value of -valueTransformersForModelClass: @property (nonatomic, copy, readonly) NSDictionary *valueTransformersByPropertyKey; @@ -144,6 +147,10 @@ - (id)initWithModelClass:(Class)modelClass { if ([modelClass respondsToSelector:@selector(relationshipModelClassesByPropertyKey)]) { _relationshipModelClassesByPropertyKey = [[modelClass relationshipModelClassesByPropertyKey] copy]; } + + if ([modelClass respondsToSelector:@selector(fetchedPropertyModelClassesByPropertyKey)]) { + _fetchedPropertyModelClassesByPropertyKey = [[modelClass fetchedPropertyModelClassesByPropertyKey] copy]; + } return self; } @@ -200,6 +207,25 @@ - (id)modelFromManagedObject:(NSManagedObject *)managedObject processedObjects:( return setValueForKey(propertyKey, value); }; + + BOOL (^deserializeFetchedProperty)(NSFetchedPropertyDescription *) = ^(NSFetchedPropertyDescription *fetchedPropertyDescription) { + Class nestedClass = self.fetchedPropertyModelClassesByPropertyKey[propertyKey]; + if (nestedClass == nil) { + [NSException raise:NSInvalidArgumentException format:@"No class specified for decoding relationship at key \"%@\" in managed object %@", managedObjectKey, managedObject]; + } + id models = performInContext(context, ^id{ + NSArray *fetchedArray = [managedObject valueForKey:managedObjectKey]; + NSMutableArray *models = [NSMutableArray arrayWithCapacity:[fetchedArray count]]; + for (NSManagedObject *nestedObject in fetchedArray) { + id model = [self.class modelOfClass:nestedClass fromManagedObject:nestedObject error:error]; + [models addObject:model]; + } + + return models; + }); + + return setValueForKey(propertyKey, models); + }; BOOL (^deserializeRelationship)(NSRelationshipDescription *) = ^(NSRelationshipDescription *relationshipDescription) { Class nestedClass = self.relationshipModelClassesByPropertyKey[propertyKey]; @@ -262,7 +288,9 @@ - (id)modelFromManagedObject:(NSManagedObject *)managedObject processedObjects:( return deserializeAttribute((id)propertyDescription); } else if ([propertyClassName isEqual:@"NSRelationshipDescription"]) { return deserializeRelationship((id)propertyDescription); - } else { + } else if ([propertyClassName isEqualToString:@"NSFetchedPropertyDescription"]) { + return deserializeFetchedProperty((id)propertyDescription); + } else { if (error != NULL) { NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"Property descriptions of class %@ are unsupported.", @""), propertyClassName];