5

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_objects をコア データに保持したいと考えています。これは、プロセス全体をどのように行うべきですか?まず、オブジェクトをセットアップします。

@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が正しく構成された RKObjectManager であるとします。応答記述子をセットアップしました。

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

これが実際に正しい方法である場合、注意する必要があることはありますか? また、BObject から AObject への逆の関係を設定するにはどうすればよいですか?

4

1 に答える 1

0

CoreData ファイルに適切に構成された関係がある限り (オブジェクト ヘッダー ファイルに基づいて正しいように見えます)、逆の関係はマッパーによって処理されます。それ以外の場合は、そのまま動作するはずです。

トークン オブジェクトは CoreData でも永続化されるため、必要な動作であるそれらを削除する必要がある場合があることに注意してください。

于 2013-10-18T17:03:07.403 に答える