0
votes

I am trying to map results from a Foursquare (FS) call. When I use AFNetworking it returns the FS results as expected (JSON). When I try the call with Restkit, either with RKEntityMapping or RKObjectMapping, I get the following error.

RKMapperOperation.m:98 Adding mapping error: No mappable values found for any of the attributes or relationship mappings

Any suggestions? Am I missing something? I know I don't have the relationship mapping setup for some of the location info, but I can't seem to get it to map the top level stuff.

RESTKIT ===============

// --- VENUE MAPPING ------------------------------

RKEntityMapping *venueMapping = [RKEntityMapping mappingForEntityForName:@"Venue"
                                                    inManagedObjectStore:objectManager.managedObjectStore];

[venueMapping addAttributeMappingsFromArray:@[@"name"] ];

[venueMapping addAttributeMappingsFromDictionary:@{
 @"id": @"venueID"
 }];


[venueMapping setIdentificationAttributes:@[@"venueID"] ];



// Routes for Users
[self.foursquareManager.router.routeSet addRoute:[RKRoute routeWithClass:[Venue class]
                                                    pathPattern:@"v2/venues/search"
                                                         method:RKRequestMethodGET]];


// Register our mappings with the provider
RKResponseDescriptor *venueResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:venueMapping
                                                                                       pathPattern:@"v2/venues/search"
                                                                                           keyPath:nil
                                                                                       statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

RKResponseDescriptor *venueDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:venueMapping
                                                                               pathPattern:@"v2/venues/search"
                                                                                   keyPath:nil
                                                                               statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];


[self.foursquareManager addResponseDescriptor:venueResponseDescriptor];
[self.foursquareManager addResponseDescriptor:venueDescriptor];

[self.foursquareManager getObject:nil
                                      path:@"v2/venues/search"
                                parameters:@{
                                             @"client_id" : kFourSquareClientID,
                                             @"client_secret" : kFourSquareClientSecret,
                                             @"ll" : searchString,
                                             @"v" : @"20130101"
                                            }

                                   success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

                                       DLog(@"Getting favorites return successful update tableview and CD ");


                                   }
                                   failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                       DLog(@"Getting all favorites failed: %@", [error localizedDescription]);

                                   }];

AFNETWORKING =============

If I use AF to make the call it returns the JSON data perfectly.

NSString *searchString = [NSString stringWithFormat:@"%@,  %@",[dictionary objectForKey:@"lat"], [dictionary objectForKey:@"lng"]];
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"https://api.foursquare.com"]];


NSDictionary *parameters = @{
                             @"client_id" : kFourSquareClientID,
                             @"client_secret" : kFourSquareClientSecret,
                             @"ll" : searchString,
                             @"v" : @"20130101"
                             };

NSMutableURLRequest *request = [client requestWithMethod:@"GET" path:@"/v2/venues/search" parameters:parameters];
DLog(@"");
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {


    NSError *error;
    NSDictionary* json = [NSJSONSerialization
                          JSONObjectWithData:JSON //1
                          options:kNilOptions
                          error:&error];

    NSLog(@"THIS IS A DICTIONARY (or array): %@", JSON);

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"if requestFailed");
}];

[operation start];

MY Venue object ==========

@interface Venue : NSManagedObject

@property (nonatomic, retain) NSString * venueID;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSNumber * verified;

@end
1

1 Answers

0
votes

Found the issue. This will resolve it.

keyPath:@"response.venues"

The JSON that FourSquare returns has many attributes and sub arrays of info. The keyPath is the path you need to walk to get to the "venues" of the JSON data. If you need to get to the just the "location" info returned you would use the following keyPath (walk the hierarchy).

keyPath:@"response.venues.location"