2013-05-30 8 views
1

Я следующий JSON:RestKit отображение множественного типа массив

{ 
    "stream": [{ 
     "catalog": {} 
    }, { 
     "catalog": {} 
    }, { 
     "user": {} 
    }] 
} 

со следующими правилами отображения:

[RKResponseDescriptor responseDescriptorWithMapping:catalogMapping 
             pathPattern:nil keyPath:@"stream.catalog" 
             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]]; 

[RKResponseDescriptor responseDescriptorWithMapping:userMapping 
             pathPattern:nil keyPath:@"stream.user" 
             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]]; 

Mapping отлично работает до тех пор, множественный тип объекта находятся в потоке. Когда поток содержит несколько объектов, скажем, пользователь и каталог restkit не может это утверждать, что:

NSCAssert([representation isKindOfClass:[NSDictionary class]], @"Expected a dictionary representation"); 

Есть ли способ, что карта структура?

+0

Так что иногда «поток» является словарем в формате JSON, а иногда это массив? – Wain

+0

это всегда множество словарей. – Ivan

+0

В этом случае поток - это массив, а не словарь? Значение 'stream' - это массив? –

ответ

3

Я имел роскошь запросить изменение API, поэтому мы переехали в

{ 
    "stream": [{ 
     "type": "catalog", 
     "other": "fields" 
    }, { 
     "type": "catalog" 
     "other": "fields" 
    }, { 
     "type": "user" 
     "other": "fields" 
    }] 
} 

An теперь я использую динамическое отображение:

RKDynamicMapping* dynamicMapping = [RKDynamicMapping new]; 
    [dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) { 
     if ([[representation objectForKey:@"type"] isEqualToString:@"catalog"]) { 
      return catalogMapping; 
     } else if ([[representation objectForKey:@"type"] isEqualToString:@"user"]) { 
      return userMapping; 
     } 
//  ... 
    }]; 


    [manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:dynamicMapping 
                      pathPattern:nil keyPath:@"stream" 
                      statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]]; 
Смежные вопросы