0

RestKit 0.20 を使用して、ネストされた辞書を含む残りの応答を処理しようとしています。ここに私が処理しようとしているjson応答があります:

{
"name": "Tom",
"msgTo": "Hi ",
"msgFrom": "Hey",
"uuid": "4",
"ClientInfo": {
    "Tom": {
        "AttributeA": "0",
        "AttributeB": "28"
    },
    "Sam": {
        "AttributeA": "10",
        "AttributeB": "28"
    }
}

}

問題は ClientInfo オブジェクトに関連しています。このオブジェクトは、pojo jackson シリアライゼーションを使用してサーバーからシリアライズされたマップ [ Map>] の Java マップです。

応答を処理するために使用している iOS/RestKit の 2 つのモデルを次に示します。

@interface IAPClientInfo : NSObject
@property (weak, nonatomic) NSString * mapName;
@property (weak,nonatomic) NSString *propertyCount;
@property (weak,nonatomic) NSString *affinityValue;
@end

@interface IAPClientMessage : NSObject
@property (weak, nonatomic) NSString * name;
@property (weak, nonatomic) NSString * msgTo;
@property (weak, nonatomic) NSString * msgFrom;
@property (weak, nonatomic) NSString * uuid;
// should this be an array?
@property (weak, nonatomic) NSArray * iapClientInfoArray;
@end

ここにコードがあります

// inner mapping
RKObjectMapping *clientInfoMapping = [RKObjectMapping mappingForClass:[IAPClientInfo class]];
[clientInfoMapping setForceCollectionMapping:YES];
[clientInfoMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"mapName"];
[clientInfoMapping addAttributeMappingsFromDictionary:@{@"(mapName).AttributeA" : @"propertyCount", @"(mapName).AttributeB" : @"affinityValue"}];

// outer mapping
RKObjectMapping *messageMapping = [RKObjectMapping mappingForClass:[IAPClientMessage class]];    
[messageMapping addAttributeMappingsFromDictionary:@{@"msgFrom" : @"msgFrom",@"msgTo" : @"msgTo",@"uuid" : @"uuid",@"name" : @"name"}];

// relationship b/w inner and outer   
RKRelationshipMapping *relationshipMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:@"ClientInfo" toKeyPath:@"iapClientInfoArray" withMapping:clientInfoMapping];
[messageMapping addPropertyMapping:relationshipMapping];

// response
RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:messageMapping
                                                                                    pathPattern:nil
                                                                                        keyPath:@""
                                                                                  statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];

応答を処理するとき、IAPClientMessage のプロパティは、null である iapClientInfoArray プロパティを除いて、すべて期待どおりです。複数の IAPClientInfo オブジェクトがありますが、json 応答では、IAPClientMessage (現在は NSArray* に設定されています) に含まれるプロパティが明確ではありません。これを適切に機能させるための提案はありますか?

TX。

4

1 に答える 1

0

すべてのプロパティを「弱い」から「強い」に変更することで、これを機能させました。

まず、あなたの提案に従ってロギングを有効にしました

RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);

IAPClientInfo および IAPClientMessage オブジェクトが正しく入力されていることが示され、基本的なセットアップに問題がないことが示唆されました。

IAPClientInfo オブジェクトは正しく設定されていましたが、null になっていました。そのため、メモリ管理の問題があるのではないかと疑っていました。

この記事を読む

http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

目的の使用法を明確にしました-すべてのプロパティが指すものを「所有」する必要があります。したがって、「弱い」セマンティクスではなく「強い」セマンティクスを使用する必要があります。ARCを使用しています。「弱い」セマンティクスにより、「作成」コードが範囲外になると、ポインター (私は推測) が「nil」を指すようになります。

プロパティがそのように変更されると、すべてが期待どおりに機能しました - iapClientInfoArray * は、適切に構築された IAPClientInfo インスタンスの配列を指していました。

ありがとう。

于 2013-06-12T09:33:13.783 に答える