Mapeo de relaciones de RestKit con key primaria

Estoy teniendo problemas para mapear las relaciones cuando la respuesta JSON solo contiene la key principal y no una matriz totalmente anidada para crear el nuevo object.

Tengo 2 classs: Tienda y artículo, y como era de esperar, el Shop-> Item tiene una relación de uno a varios.

Tengo una tienda local de datos centrales de tiendas (y artículos), cada una con una key primaria. Entonces deseo download una list de Elementos como JSON y asignarlos a entidades de datos centrales, pero solo include la key primaria de la tienda, y no todos los detalles de la tienda como una matriz anidada, esto sería una gran pérdida de tráfico de networking como yo Estoy descargando detalles de más de 500 artículos.

Aquí está el JSON de las dos requestes:

/ tiendas

{ "id" : 1, "shop" : "Shop A", "city" : "New York" }, { "id" : 2, "shop" : "Shop B", "city" : "London" }, ... 

/artículos

 { "id" : 1, "name" : "Shoes", "manufacturer" : "Vans", "shopId" : 1 }, { "id" : 2, "name" : "T-shirt", "manufacturer" : "Animal", "shopId" : 2 }, { "id" : 3, "name" : "Scarf", "manufacturer" : "Ted Baker", "shopId" : 1 }, { "id" : 4, "name" : "Sunglasses", "manufacturer" : "Ray-Ban", "shopId" : 3 }, ... 

Aquí está mi código en este momento.

AppDelegate.m

 ... NSURL *baseURL = [NSURL URLWithString:@"http://localhost/company/API"]; RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL]; [AFNetworkActivityIndicatorManager shanetworkingManager].enabled = YES; [objectManager.HTTPClient setDefaultHeader:@"Accept" value:@"application/json"]; NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; objectManager.managedObjectStore = managedObjectStore; // Shop Mapping RKEntityMapping *shopMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Shop class]) inManagedObjectStore:objectManager.managedObjectStore]; NSDictionary *shopMappingAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"objectId",@"id",@"name",@"shop",@"city",@"city",nil]; shopMapping.identificationAttributes = @[@"objectId"]; [shopMapping addAttributeMappingsFromDictionary:shopMappingAttributes]; [objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:shopMapping pathPattern:@"/shops" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]]; // Item Mapping RKEntityMapping *itemMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Item class]) inManagedObjectStore:objectManager.managedObjectStore]; NSDictionary *itemMappingAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"objectId",@"id",@"name", @"name",@"manufacturer",@"manufacturer",nil]; itemMapping.identificationAttributes = @[@"objectId"]; [itemMapping addAttributeMappingsFromDictionary:itemMappingAttributes]; // Define the relationship mapping [objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:itemMapping pathPattern:@"/items" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]]; ... 

ItemsTableViewController.m

 - (void)viewDidLoad { [super viewDidLoad]; // Update Shops [[RKObjectManager shanetworkingManager] getObjectsAtPath:@"/shops" parameters:nil success:nil failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"Error: %@",error); }]; // Update/Get Items NSDictionary *parameters = @{ @"username": self.username, @"password": self.password, @"API_key": @"abc123", }; NSMutableURLRequest *request = [[RKObjectManager shanetworkingManager] requestWithObject:nil method:RKRequestMethodPOST path:@"/items" parameters:parameters]; RKManagedObjectRequestOperation *operation = [[RKObjectManager shanetworkingManager] managedObjectRequestOperationWithRequest:request managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { Item *item = [mappingResult firstObject]; NSLog(@"Mapped the Item: %@", item); } failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"Error: %@",error); }]; NSOperationQueue *operationQueue = [NSOperationQueue new]; [operationQueue addOperation:operation]; } 

EDIT: Wain, tengo esto en el lugar relevante en el delegado de la aplicación pero obtengo una NSException

 NSEntityDescription *itemEntity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectStore.mainQueueManagedObjectContext]; NSRelationshipDescription *shopRelationship = [itemEntity relationshipsByName][@"shop"]; RKConnectionDescription *connection = [[RKConnectionDescription alloc] initWithRelationship:shopRelationship attributes:@{ @"shopId": @"objectId" }]; [itemMapping addConnection:connection]; 

NSException

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Item'' 

¿Qué me he perdido?

shopId agregar un atributo transitorio al elemento (llamado shopId ) y una asignación asociada.

Configure la relación utilizando la asignación de keys externas como:

 NSEntityDescription *itemEntity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectContext]; NSRelationshipDescription *shopRelationship = [itemEntity relationshipsByName][@"shop"]; RKConnectionDescription *connection = [[RKConnectionDescription alloc] initWithRelationship:shopRelationship attributes:@{ @"shopId": @"id" }]; 

Luego usa addConnection: para agregarlo a tu mapeo.