From 00621daea67c5f1718591b586faa26b997bec8a7 Mon Sep 17 00:00:00 2001 From: Art Mukha Date: Tue, 23 Jun 2015 16:40:48 +0300 Subject: [PATCH] Fix dictionary mapping --- Classes/NSManagedObject+Mappings.h | 7 +++++++ Classes/NSManagedObject+Mappings.m | 17 +++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Classes/NSManagedObject+Mappings.h b/Classes/NSManagedObject+Mappings.h index 7ac1641..28b9a9d 100644 --- a/Classes/NSManagedObject+Mappings.h +++ b/Classes/NSManagedObject+Mappings.h @@ -61,4 +61,11 @@ */ + (NSString *)primaryKey; +/** + Remote key for primaryKey. E.g., @c @@"remote_id". + + @return A remote key name or primaryKey if not overriden + */ ++ (NSString *)remotePrimaryKey; + @end diff --git a/Classes/NSManagedObject+Mappings.m b/Classes/NSManagedObject+Mappings.m index 52adc45..82e0df1 100644 --- a/Classes/NSManagedObject+Mappings.m +++ b/Classes/NSManagedObject+Mappings.m @@ -59,8 +59,17 @@ + (id)objectOrSetOfObjectsFromValue:(id)value ofClass:class inContext:(NSManaged if ([value isKindOfClass:class]) return value; - if ([value isKindOfClass:[NSDictionary class]]) - return [class findOrCreate:value inContext:context]; + if ([value isKindOfClass:[NSDictionary class]]) { + NSString *primaryValue = value[ [class remotePrimaryKey] ]; + + if (primaryValue) { + NSManagedObject *object = [class findOrCreate:@{ [class primaryKey]: primaryValue } inContext:context]; + [object update:value]; + return object; + } + + return [class findOrCreate:value inContext:context]; + } if ([value isKindOfClass:[NSArray class]]) return [NSSet setWithArray:[value map:^id(id object) { @@ -116,4 +125,8 @@ + (id)primaryKey { userInfo:nil]; } ++ (NSString *)remotePrimaryKey { + return [self primaryKey]; +} + @end