Отношение один ко многим не работает (Restkit 0.20) addRelationshipMappingWithSourceKeyPath

У меня есть простое отношение «один ко многим» в моем JSON, и я хотел бы сопоставить это с объектами (НЕ сущностями основных данных). Отображение продуктов работает нормально. Но у каждого продукта есть массив дорожек, которые не сопоставлены.

Это JSON:

введите здесь описание изображения

Вот код:

Продукт.ч

#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.

Заранее спасибо за любую подсказку.


person brainray    schedule 01.07.2013    source источник


Ответы (1)


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

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

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

person Wain    schedule 01.07.2013