2014-02-13 48 views
1

如何將多個對象映射到一個JSON對象?爲RestKit合併對象

這裏是我的兩個對象

#import <RestKit/RestKit.h> 

@interface Account : NSObject 
@property NSInteger id; 
@property NSString* secret; 
@end 
@implementation Account @end 

@interface Entry : NSObject 
@property NSString* name; 
@end 
@implementation Entry @end 

而且我希望這些對象映射到以下JSON:

/* Goal JSON: 
    { 
    "id":10, 
    "secret":"supersecret", 
    "eventName":"Hayooo" 
    } 
    */ 

第一次嘗試直接使用RKMapperOperation:

void testMergeMap(){ 
    Account* account = [Account new]; 
    account.id = 10; 
    account.secret = @"supersecret"; 

    Entry* entry = [Entry new]; 
    entry.name = @"Hayooo"; 

    RKMapperOperation* mapper = [[RKMapperOperation alloc] 
           initWithRepresentation:@{@"account":account, @"entry":entry} mappingsDictionary:@{@"account.id": @"id", @"account.secret":@"secret", @"entry.name":@"eventName"}]; 
    [mapper start]; 
    RKMappingResult* result = mapper.mappingResult; 
    NSLog(@"%@", result.dictionary.description); 
} 

但是,這崩潰,不能真正使錯誤的東西。

那麼,我該怎麼做呢?

編輯

我也試過這個

RKObjectManager* testSimpleMap(Account* account, Entry* entry){ 
    RKObjectMapping* map = [RKObjectMapping requestMapping]; 
    [map addAttributeMappingsFromDictionary: 
    @{@"account.id": @"id", 
     @"account.secret": @"secret", 
     @"entry.name":@"eventName"}]; 

    RKObjectManager* man = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://google.com"]]; 
    RKRequestDescriptor* requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:map objectClass:nil rootKeyPath:nil method:RKRequestMethodPOST]; 
    [man addRequestDescriptor:requestDescriptor]; 
    [man postObject:@{@"account":account, @"entry":entry} path:@"/" parameters:nil success:nil failure:nil]; 

    return man; 
} 

但是,如果沒有一個類,所以不能創建requestDescriptors,這樣是行不通的。但我認爲了解我的目標很有用。如果那能行得通,那會很棒!

+0

隨意編輯,請不要以這種方式進行編輯,它不能複製並粘貼到編輯器中。我小心翼翼地讓它自成一體,不要毀了它。 – Nick

回答

0

mappingsDictionary:不應該是一個普通的字符串鍵和值的字典。密鑰應該是要映射的項目的關鍵路徑,值應該是RKMapping實例,它們描述如何映射在關鍵路徑中找到的數據。

一般來說,如果你剛開始,我不會直接使用RKMapperOperation。我會看看使用RKObjectManager。它將你從這樣的內部細節中抽象出來。

如果您想繼續使用,請檢查示例in the docs

+0

我不想直接繼續使用RKMapperOperation,而是在我的「真實」應用程序中使用RKObjectManager(這只是一個小小的測試用例)。我剛剛在文檔中看到這門課,並認爲值得嘗試。我應該如何用RKMapping實例做到這一點? – Nick

+0

您以前使用過'RKObjectMapping'嗎?如果你有一個對象管理器,那麼我想是這樣。只需將屬性名稱映射到JSON密鑰名稱即可。 – Wain

+0

但我無法弄清楚如何創建一個映射,以便我可以將Account和Entry對象合併到一個請求中。那就是問題所在。 TUTORIAL.MD很好地展示瞭如何從關係中獲得一個響應中的2個對象,但是如何在1個請求中發送2個對象? – Nick

0

創建模型化關係的第三個對象起作用,但我覺得它不夠優雅。

@interface Both : NSObject 
@property Account* account; 
@property Entry* entry; 
@end 
@implementation Both @end 

RKObjectManager* testRelationMap(Account* account, Entry* entry){ 
    /* Goal JSON: 
    { 
     "user":{ 
      "id":10, 
      "secret":"supersecret", 
     }, 
     "entry":{ 
      "name":"Hayooo" 
     } 
    } 
    */ 

    Both* both = [Both new]; 
    both.account = account; 
    both.entry = entry; 

    RKObjectMapping* accountMap = [RKObjectMapping requestMapping]; 
    [accountMap addAttributeMappingsFromArray:@[@"id", @"secret"]]; 

    RKObjectMapping* entryMap = [RKObjectMapping requestMapping]; 
    [entryMap addAttributeMappingsFromArray:@[@"name"]]; 

    RKObjectMapping* relationMap = [RKObjectMapping requestMapping]; 
    [relationMap addRelationshipMappingWithSourceKeyPath:@"account" mapping:accountMap]; 
    [relationMap addRelationshipMappingWithSourceKeyPath:@"entry" mapping:entryMap]; 

    RKObjectManager* man = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://google.com"]]; 
    RKRequestDescriptor* requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:relationMap objectClass:[Both class] rootKeyPath:nil method:RKRequestMethodPOST]; 
    [man addRequestDescriptor:requestDescriptor]; 
    [man postObject:both path:@"/" parameters:nil success:nil failure:nil]; 
    return man; 
} 

有很多需要這樣的代碼,但它是一個解決方案。