2013-07-01 2 views
1

У меня есть simpe one to many relationshipim мой JSON и хотел бы сопоставить это с объектами (NOT Core Data). Сопоставление поддуктов работает нормально. Но каждый продукт имеет массив треков, которые не отображаются.от одного до многих отношений не работает (Restkit 0.20) addRelationshipMappingWithSourceKeyPath

Это JSON:

enter image description here

Вот код:

Product.h

#import <Foundation/Foundation.h> 

@interface Product : NSObject 

@property (nonatomic, strong) NSString* productid; 
@property (nonatomic, strong) NSString* title; 
@property (nonatomic, strong) NSString* artist; 
//... 
@property (nonatomic, strong) NSMutableArray *tracks; 


Track.h

#import <Foundation/Foundation.h> 

@interface Track : NSObject 

@property (nonatomic, strong) NSString *artist; 
@property (nonatomic, strong) NSString *title; 
@property (nonatomic, strong) NSString *mixversion; 



Вот код для запроса JSON и отобразить ответ на объекты

/// Create Mappers for Product and Track 
RKObjectMapping *mappingForProduct = [RKObjectMapping mappingForClass:[Product class]]; 

[mappingForProduct addAttributeMappingsFromArray:@[@"productid", @"title", @"tracks"]]; 


RKObjectMapping *mappingForTrack = [RKObjectMapping mappingForClass:[Track class]]; 
[mappingForTrack addAttributeMappingsFromArray:@[@"artist",@"title",@"mixversion"]]; 

/// assign relationship product-track 
[mappingForProduct addRelationshipMappingWithSourceKeyPath:@"tracks" mapping:mappingForTrack]; 

/// setup responseDescriptor 
NSString *key_path = @"products"; 
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mappingForProduct 
                        pathPattern:nil 
                         keyPath:key_path 
                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 


/// Create Manager, connect responseDescriptor and execute 
RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"myRequestString"]]; 



[manager addResponseDescriptor:responseDescriptor]; 
[manager getObject:nil path:@"" parameters:nil 
      success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
      { 
       self.productsArray = [NSMutableArray arrayWithArray:mappingResult.array]; 
      } 

      failure:^(RKObjectRequestOperation *operation, NSError *error) 
      { 
       NSLog(@"Error: %@", error); 
      } 


Это дает ошибку утверждение:

*** Assertion failure in -[RKObjectMapping addPropertyMapping:],  /Users/.../Pods/RestKit/Code/ObjectMapping/RKObjectMapping.m:235 



Волшебство должно произойти в этой строке:

[mappingForProduct addRelationshipMappingWithSourceKeyPath:@"tracks" mapping:mappingForTrack]; 


... но почему-то не делает.

Я искал довольно много источников на SO и документации, испробовал несколько комбинаций keypath, но ничего не даст требуемого результата. Множество доступных образцов кода относится к более старым версиям RestKit или относится к Core Data. Я просто хочу получить сопоставленные объекты, никаких объектов Core Data.

Заранее благодарим за любой намек.

ответ

1

Вы просто пытаетесь добавить отображение для tracks дважды. Это должно быть сопоставление отношений, а не сопоставление атрибутов. Изменение mappingForProduct на:

[mappingForProduct addAttributeMappingsFromArray:@[@"productid", @"title"]]; 

И причиной исключения должны быть удалены.

+0

Спасибо, это была пропавшая часть информации – brainray

Смежные вопросы