0
votes

JSONs:

Code:

NSURL *baseURL = [NSURL URLWithString:@"http://www.krzysztofkurzawa.com"];
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL];

RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[mapping addAttributeMappingsFromArray:@[@"title"]];

RKResponseDescriptor *rk = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"articles" keyPath:@"articles" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:rk];

RKObjectMapping *mapping2 = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[mapping addAttributeMappingsFromArray:@[@"title"]];

RKResponseDescriptor *rk2 = [RKResponseDescriptor responseDescriptorWithMapping:mapping2 pathPattern:@"articles/:id" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:rk2];


[[RKObjectManager sharedManager] getObjectsAtPath:@"articles" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"%@", [mappingResult firstObject]);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {

}];

[[RKObjectManager sharedManager] getObjectsAtPath:@"articles/1" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"%@", [mappingResult firstObject]);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {

}];

Error: No mappable object representations were found at the key paths searched.", keyPath=null, NSLocalizedDescription=No response descriptors match the response loaded.}

I haven't got any ideas. The first mapping works, when pathPattern is set to nil. Why must it be nil? Maybe it is needed for creating rest path patterns.

2
Why are you using [RKObjectManager sharedManager] when getting your objects? I think you should better use objectManager - Alexander Tkachenko
This is singleton - [RKObjectManager sharedManager] - user3204782
But you are initializing mappings with another RKObjectManager instance created in your first lines RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL]; - Alexander Tkachenko
Yes, You are right. I changed [RKObjectManager sharedManager] to objectManager. To use [RKObjectManager sharedManager] is needed to [RKObjectManager setManager:]. But no result. Error "No mappable..." - user3204782
Your error appears at the second request when you are trying to load a single Article? Sorry but I can't run your code because RestKit gives me compiler errors when installing via Cocoapods - Alexander Tkachenko

2 Answers

0
votes

May be this halp you

NSString *pathNotation = @"/Notations/:notation_id";    
RKRoute *notationRoute = [RKRoute routeWithClass:[Notation class] pathPattern:pathNotation method:RKRequestMethodGET];
[self.objectManager.router.routeSet addRoute:notationRoute];

RKResponseDescriptor *notationMappingDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:notationMapping method:RKRequestMethodGET pathPattern:pathNotation keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

and GET:

[[RKObjectManager sharedManager] getObject:nil path:path parameters:params success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        //do something
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        //do something
    }];
0
votes

Your paths were not correct, also, when running your code I had to use the method:

+ (instancetype)responseDescriptorWithMapping:(RKMapping *)mapping
                                       method:(RKRequestMethod)method
                                  pathPattern:(NSString *)pathPattern
                                      keyPath:(NSString *)keyPath
                                  statusCodes:(NSIndexSet *)statusCodes

The one you are using it says it's deprecated. I guess you might be using an old version of restkit.

Here is the code that works:

NSURL *baseURL = [NSURL URLWithString:@"http://www.krzysztofkurzawa.com"];
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL];

RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[mapping addAttributeMappingsFromArray:@[@"title"]];

RKResponseDescriptor *rk = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodGET pathPattern:@"/articles/" keyPath:@"articles" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:rk];

RKObjectMapping *mapping2 = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[mapping2 addAttributeMappingsFromArray:@[@"title"]];

RKResponseDescriptor *rk2 = [RKResponseDescriptor responseDescriptorWithMapping:mapping2  method:RKRequestMethodGET pathPattern:@"/articles/:id/" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:rk2];


[[RKObjectManager sharedManager] getObjectsAtPath:@"/articles/" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"%@", [mappingResult firstObject]);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {

}];

[[RKObjectManager sharedManager] getObjectsAtPath:@"/articles/1/" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"%@", [mappingResult firstObject]);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {

}];