У меня есть простое отношение «один ко многим» в моем 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.
Заранее спасибо за любую подсказку.