Załóżmy, że chcemy wysłać żądanie do serwera z jsonRestKit v0.20.x: jednoczesne mapowanie (przejściowe) i obiektu (dane podstawowe) zarządzanego obiektu
{ "begin_session" : { "info" : "this is some info" } }
i oczekuję w odpowiedzi 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" }
] }
Chcę przechować "token" przejściowo i utrzymywać a_objects w danych podstawowych. Czy tak powinienem zrobić cały proces? Po pierwsze, skonfigurować obiekty:
@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
Są to parametry żądania:
NSDictionary *params = @{"begin_session":@{@"info":@"this is some info"}};
Potem skonfigurować mapowania:
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"];
Załóżmy objectManager
jest poprawnie skonfigurowany RKObjectManager. Założyłem deskryptory odpowiedzi:
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]];
I wreszcie zrobię zgłoszeniu:
[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
}];
Czy jest coś muszę mieć świadomość, czy jest to w rzeczywistości, poprawny sposób Zrób to? Ponadto, w jaki sposób ustawić odwrotnej relacji z BObject do AObject ...?