RestKit とオブジェクトのマッピングで奇妙な動作が見られます。目的のオブジェクトに、'description' という名前の NSString * プロパティがある場合、マッピング全体が失敗します。これを他の名前に変更するか、コメントアウトすると、すべてが成功します。これは、プロパティにマップを設定しているかどうかに関係なく発生し、簡単なテスト クラスで再現できます。
サーバーが返す JSON:
{
id = 1;
name = item1;
},
{
id = 2;
name = item2;
}
マップ先のオブジェクト、SimpleObject.h。説明も存在しないプロパティも JSON に含まれていないことに注意してください。つまり、「説明」が欠落しているためではないと思います。
#import <Foundation/Foundation.h>
@interface SimpleObject : NSObject
@property (nonatomic, assign) NSInteger identifier;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *description;
@property (nonatomic, retain) NSString *nonexistant;
@end
SimpleObject.m:
#import "SimpleObject.h"
@implementation SimpleObject
@synthesize identifier;
@synthesize name;
@synthesize description;
@synthesize nonexistant;
@end
AppDelegate でマッピングを作成します。
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURLString:@"http://127.0.0.1/test"];
// Setup our object mappings
RKObjectMapping *testMapping = [RKObjectMapping mappingForClass:[SimpleObject class]];
[testMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[testMapping mapKeyPath:@"name" toAttribute:@"name"];
// Register our mappings with the provider using a resource path pattern
[objectManager.mappingProvider setObjectMapping:testMapping forResourcePathPattern:@"/products"];
didLoadObjects メソッド内には、次のものがあります。
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
NSLog(@"Loaded products: %@", objects);
SimpleObject *obj = [objects objectAtIndex:0];
NSLog(@"Loaded product ID %d -> Name: %@ ", obj.identifier, obj.name);
}
これは以下を出力します:
Finished performing object mapping. Results: {
"" = (
(null),
(null)
);
}
description プロパティをコメントアウトすると (ただし、存在しないままにしておくと)、すべてが機能します。
Finished performing object mapping. Results: {
"" = (
"<SimpleObject: 0x8a4d040>",
"<SimpleObject: 0x8a50130>"
);
}
このプロパティ名に対してのみマッピングが失敗する理由はありますか? 名前を「説明」以外に変更しても成功します。