2012-12-19 3 views
5

nehme ich als Antwort eine Anfrage an den Server mit dem jsonRestKit v0.20.x: gleichzeitig abbildet (transient) Objekt und (Kerndaten) verwaltete Objekt

{ "begin_session" : { "info" : "this is some info" } } 

und ich erwarte, senden möchten die json :

{ "token" : "this is a token", "a_objects" : [ 
    { "name" : "name of first a_object", "b_objects" : [ 
     { "name" : "name of first b_object", "type" : "some type value", "id" : "123" }, 
     { "name" : "name of second b_object", "type" : "some other type value", "id" : "124" } 
    ], "id" : "id of first a_object" }, 
    { "name" : "name of second a_object", "b_objects" : [ 
     { "name" : "name of first b_object", "type" : "some type value", "id" : "123" }, 
     { "name" : "name of third b_object", "type" : "some third type value" , "id" : "125" }, 
    ], "id" : "id of second a_object" } 
] } 

Ich möchte "Token" vorübergehend speichern und die a_objects in Kerndaten beibehalten. Soll ich den gesamten Prozess so machen? Zuerst stellte ich die Objekte up:

@interface LoginToken : NSObject 
    @property (nonatomic, copy) NSString *token; 
@end 

@interface AObject : NSManagedObject 
    @property (nonatomic, retain) NSString *name; 
    @property (nonatomic, retain) NSSet *bObjects; 
    @property (nonatomic, retain) NSString *aObjectId; 
@end 

@implementation AObject 
    @dynamic name; @dynamic bObjects; @dynamic aObjectId; 
@end 

@interface BObject : NSManagedObject 
    @property (nonatomic, retain) NSString *name; 
    @property (nonatomic, retain) AObject *aObject; 
    @property (nonatomic, retain) NSString *type; 
    @property (nonatomic, retain) NSString *bObjectId; 
@end 

@implementation BObject 
    @dynamic name; @dynamic aObject; @dynamic type; @dynamic bObjectId; 
@end 

Dies sind die Anforderungsparameter:

NSDictionary *params = @{"begin_session":@{@"info":@"this is some info"}}; 

Dann habe ich die Zuordnungen up:

RKObjectMapping *tokenMapping = [RKObjectMapping mappingForClass:[LoginToken class]]; 
[tokenMapping addAttributeMappingsFromArray:@[@"token"]]; 
RKResponseDescriptor *tokenResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:tokenMapping pathPattern:nil keyPath:@"token" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

RKEntityMapping *bObjectMapping = [RKEntityMapping mappingForEntityForName:@"BObject" inManagedObjectStore:objectManager.managedObjectStore]; 
[bObjectMapping addAttributeMappingsFromDictionary:@{@"name":@"name",@"type":@"type", @"id":@"bObjectId"}]; 
bObjectMapping.identificationAttributes = @[@"bObjectId"]; 

RKEntityMapping *aObjectMapping = [RKEntityMapping mappingForEntityForName:@"AObject" inManagedObjectStore:objectManager.managedObjectStore]; 
[aObjectMapping addAttributeMappingsFromDictionary:@{@"name":@"name",@"id":@"aObjectId"}]; 
[aObjectMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"b_objects" toKeyPath:@"bObjects" withMapping:bObjectMapping]]; 
aObjectMapping.identificationAttributes = @[@"aObjectId"]; 

Angenommen objectManager ist ein richtig konfiguriert RKObjectManager. Ich habe die Antwort-Deskriptoren auf:

RKResponseDescriptor *tokenResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:tokenMapping pathPattern:nil keyPath:@"token" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

RKResponseDescriptor *aObjectResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:aObjectMapping pathPattern:nil keyPath:@"a_objects" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

[objectManager addResponseDescriptorsFromArray:@[tokenResponseDescriptor, aObjectResponseDescriptor]]; 

Und schließlich werde ich den Antrag stellen:

[objectManager getObjectsAtPath:@"path" parameters:params success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
    LoginToken *token = [mappingResult firstObject]; // use this token transiently 
    // coredata objects are auto saved 
} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    // handle error 
}]; 

Gibt es etwas, das ich bewusst sein müssen, wenn dies in der Tat der richtige Weg zu TU es? Wie setze ich die inverse Beziehung von BObject zu AObject ...?

Antwort

0

Solange Ihre CoreData-Datei die Beziehung richtig konfiguriert hat (was auf Basis Ihrer Objektheaderdateien korrekt aussieht), wird die umgekehrte Beziehung vom Mapper verarbeitet. Ansonsten sollte es so wie es ist funktionieren.

Beachten Sie, dass das Token-Objekt auch in CoreData beibehalten wird, so dass Sie diese möglicherweise löschen müssen, das ist das gewünschte Verhalten.

Verwandte Themen