RestKit: conectar una relación que no está en la respuesta

Supongamos que en mi model de datos tengo Pages , que tienen muchos Comments .

Quiero conectar una relación en el model que va desde el comentario a la página a la que pertenece, pero el object Página no está nested en la respuesta, ni tampoco hay ninguna key primaria que pueda identificar la página principal presente en la respuesta .

En el momento en que loadObjectsAtResourcePath , todos los Comments que se carguen deben pertenecer a un object de Page fijo y conocido. Una forma en que podría conectar la relación sería hacerlo:

 loader.onDidLoadObjects = ^(NSArray* objs) { for (Comment* comment in objs) comment.page = self.page; ... } 

pero espero que haya una mejor manera. Tenga en count que no puedo usar la familia de methods de connectRelationship , porque no hay una key primaria en la respuesta que me permita enlazar cada Comment a una Page .

Puede usar el método delegate - (void)objectLoader:(RKObjectLoader *)loader willMapData:(inout id *)mappableData para inyectar parameters adicionales antes del paso de mapeo. Asegura que los objects y las relaciones serán guardados correctamente por RestKit si está utilizando los datos del núcleo (tenga en count que la solución que dio arriba no guarda la relación).

Alternativamente, mire esta respuesta donde mostré cómo anular RKObjectLoader para recuperar la información de la página desde la URL misma.

EDIT: Aquí está la categoría que mencioné en el comentario:

.marido

 #import <RestKit/RestKit.h> typedef void(^RKObjectLoaderWillMapDataBlock)(id* mappableData); @interface RKObjectLoader (Extended) @property (nonatomic, copy) RKObjectLoaderWillMapDataBlock onWillMapData; @end 

y ellos:

 #import <objc/runtime.h> NSString* kOnWillMapDataKey = @"onWillMapData"; @implementation RKObjectLoader (Extended) - (RKObjectLoaderWillMapDataBlock) onWillMapData { return objc_getAssociatedObject(self, &kOnWillMapDataKey); } - (void) setOnWillMapData:(RKObjectLoaderWillMapDataBlock) block { objc_setAssociatedObject(self, &kOnWillMapDataKey, block, OBJC_ASSOCIATION_COPY); } - (RKObjectMappingResult*)mapResponseWithMappingProvider:(RKObjectMappingProvider*)mappingProvider toObject:(id)targetObject inContext:(RKObjectMappingProviderContext)context error:(NSError**)error { id<RKParser> parser = [[RKParserRegistry shanetworkingRegistry] parserForMIMEType:self.response.MIMEType]; NSAssert1(parser, @"Cannot perform object load without a parser for MIME Type '%@'", self.response.MIMEType); // Check that there is actually content in the response body for mapping. It is possible to get back a 200 response // with the appropriate MIME Type with no content (such as for a successful PUT or DELETE). Make sure we don't generate an error // in these cases id bodyAsString = [self.response bodyAsString]; RKLogTrace(@"bodyAsString: %@", bodyAsString); if (bodyAsString == nil || [[bodyAsString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) { RKLogDebug(@"Mapping attempted on empty response body..."); if (self.targetObject) { return [RKObjectMappingResult mappingResultWithDictionary:[NSDictionary dictionaryWithObject:self.targetObject forKey:@""]]; } return [RKObjectMappingResult mappingResultWithDictionary:[NSDictionary dictionary]]; } id parsedData = [parser objectFromString:bodyAsString error:error]; if (parsedData == nil && error) { return nil; } // Allow the delegate to manipulate the data if ([self.delegate respondsToSelector:@selector(objectLoader:willMapData:)]) { parsedData = [parsedData mutableCopy]; [(NSObject<RKObjectLoaderDelegate>*)self.delegate objectLoader:self willMapData:&parsedData]; } if( self.onWillMapData ) { parsedData = [parsedData mutableCopy]; self.onWillMapData(&parsedData); } RKObjectMapper* mapper = [RKObjectMapper mapperWithObject:parsedData mappingProvider:mappingProvider]; mapper.targetObject = targetObject; mapper.delegate = (id<RKObjectMapperDelegate>)self; mapper.context = context; RKObjectMappingResult* result = [mapper performMapping]; // Log any mapping errors if (mapper.errorCount > 0) { RKLogError(@"Encountenetworking errors during mapping: %@", [[mapper.errors valueForKey:@"localizedDescription"] componentsJoinedByString:@", "]); } // The object mapper will return a nil result if mapping failed if (nil == result) { // TODO: Construct a composite error that wraps up all the other errors. Should probably make it performMapping:&error when we have this? if (error) *error = [mapper.errors lastObject]; return nil; } return result; } @end