Objective c RestKit v0.20.x:同时映射(瞬态)对象和(核心数据)托管对象

Objective c RestKit v0.20.x:同时映射(瞬态)对象和(核心数据)托管对象,objective-c,ios,core-data,restkit,Objective C,Ios,Core Data,Restkit,假设我想用json向服务器发送一个请求 { "begin_session" : { "info" : "this is some info" } } 我希望json会做出回应: { "token" : "this is a token", "a_objects" : [ { "name" : "name of first a_object", "b_objects" : [ { "name" : "name of first b_object", "type" : "s

假设我想用json向服务器发送一个请求

{ "begin_session" : { "info" : "this is some info" } }
我希望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" }
] }
我想暂时存储“令牌”,并将a_对象持久化到核心数据中。我应该这样做整个过程吗?首先,我设置对象:

@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
以下是请求参数:

NSDictionary *params = @{"begin_session":@{@"info":@"this is some info"}};
然后设置映射:

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"];
假设
objectManager
是正确配置的对象管理器。我设置了响应描述符:

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]];
最后我会提出请求:

[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
}];

如果这是正确的方法,我需要知道什么吗?此外,如何设置从BobObject到AoObject的反向关系…?

只要CoreData文件正确配置了该关系(根据对象头文件,该关系看起来是正确的),则反向关系由映射器处理。否则,它应该按原样工作

请注意,令牌对象也将保留在CoreData中,因此您可能必须删除它们,这是所需的行为