2012-12-19 23 views
5

Giả sử tôi muốn gửi một yêu cầu đến máy chủ với các jsonRestKit v0.20.x: đồng thời lập bản đồ (thoáng qua) đối tượng và (dữ liệu cốt lõi) đối tượng được quản lý

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

và tôi hy vọng trong phản ứng 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" } 
] } 

Tôi muốn lưu trữ "mã thông báo" tạm thời và duy trì a_object trong dữ liệu cốt lõi. Đây có phải là cách tôi nên làm toàn bộ quá trình không? Trước tiên, tôi thiết lập các đối tượng:

@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 

Đây là những thông số yêu cầu:

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

Sau đó, tôi thiết lập ánh xạ:

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"]; 

Giả sử objectManager là một RKObjectManager cấu hình đúng. Tôi thiết lập các mô tả phản ứng:

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

Và cuối cùng tôi sẽ thực hiện yêu cầu:

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

Có điều gì tôi cần phải nhận thức được nếu điều này là, trên thực tế, cách chính xác để làm đi? Ngoài ra, làm thế nào để tôi thiết lập mối quan hệ nghịch đảo từ BObject thành AObject ...?

Trả lời

0

Miễn là tệp CoreData của bạn có mối quan hệ được định cấu hình đúng (có vẻ chính xác dựa trên tệp tiêu đề đối tượng của bạn) thì mối quan hệ nghịch đảo được xử lý bởi người lập bản đồ. Nếu không, nó sẽ hoạt động như vậy.

Lưu ý rằng đối tượng mã thông báo cũng sẽ được lưu giữ trong CoreData để bạn có thể phải xóa chúng là hành vi mong muốn.

Các vấn đề liên quan