Question

I use the code below to login to the server:

//First Block Code

-(RKObjectManager *)getObjectManager
{
    NSURL *baseURL = [NSURL URLWithString:@"http://api.domain.com"];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:baseURL];
    RKObjectManager *manager = [[RKObjectManager alloc]initWithHTTPClient:httpClient];
    [manager.HTTPClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
    [manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON];
    [manager.HTTPClient setParameterEncoding:AFJSONParameterEncoding];
    [RKMIMETypeSerialization registeredMIMETypes];
    return [RKObjectManager sharedManager];
}

- (void)loginUserwithUsername:(NSString *)username andPassword:(NSString *)password requestByNewUser:(BOOL)newRegistration
{
    [self getObjectManager];

    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    [objectManager.HTTPClient setAuthorizationHeaderWithUsername:username password:password];

    NSIndexSet *statusCodeSet = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
    RKMapping *mapping = [RESTMappingProvider profileMapping];
    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
                                                                                            method:RKRequestMethodGET
                                                                                       pathPattern:nil
                                                                                           keyPath:nil statusCodes:statusCodeSet];

    NSMutableURLRequest *request = [objectManager.HTTPClient requestWithMethod:@"POST"
                                                                          path:@"/login"
                                                                    parameters:@{@"username": username,
                                                                                 @"password": password
                                                                                 }];
    RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request
                                                                        responseDescriptors:@[responseDescriptor]];
    [objectManager.HTTPClient  registerHTTPOperationClass:[AFHTTPRequestOperation class]];

    [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

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


}

AFTER I login, I try to make a Google Places API request and get an error:

//Second Block of Code

- (void)fetchPlaces:(NSString *)input;
{
    NSIndexSet *statusCodeSet = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
    RKMapping *mapping = [RESTMappingProvider googleAutoCompleteMapping];

    NSString *urlString = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/json?input=%@&sensor=true&key=%@&location=0.000000,0.000000", input, self.key];
    NSString *urlStringEncoded = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:urlStringEncoded];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
                                                                                            method:RKRequestMethodGET
                                                                                       pathPattern:nil
                                                                                           keyPath:@"predictions" statusCodes:statusCodeSet];

    RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request
                                                                        responseDescriptors:@[responseDescriptor]];

    [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        self.responseObjects = mappingResult.array;
    [operation start];
}

Error:

2014-04-02 14:11:17.865 App[1247:60b] *** Assertion failure in +[RKPathMatcher pathMatcherWithPattern:], /Users/App
 Time/Pods/RestKit/Code/Support/RKPathMatcher.m:74
2014-04-02 14:11:17.868 App[1247:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Pattern string must not be empty in order to perform pattern matching.'

However, if I never Login (meaning that I skip the first code in this question) and go straight to call Google API, there is no crash API works great.

I think there is something that I'm doing to RESTKit (perhaps by creating an ObjectManager), by Logging-in that's causing Google's API call to cause a crash.

I tried to run Charles Web Debug Proxy, but the crash seems to happen even before making the API call.

*EDIT *

I found out what is causing the crash:

[[RKObjectManager sharedManager] cancelAllObjectRequestOperationsWithMethod:RKRequestMethodAny matchingPathPattern:nil];

This was an attempt to Cancel all previous requests.

I replaced it with:

[[RKObjectManager sharedManager] cancelAllObjectRequestOperationsWithMethod:RKRequestMethodAny matchingPathPattern:@"maps/api/place/autocomplete"];

and it seems to work.

Question: Does this code cancel any previous request to: https://maps.googleapis.com/maps/api/place/autocomplete/json ?

Was it helpful?

Solution

When you create responseDescriptor this is added to the RKObjectManager you use pathPattern:nil. This is not permitted. You must specify a path pattern as RestKit must lookup the appropriate response descriptor to apply to the received response.

Later, you again use pathPattern:nil, but this is directly with an RKObjectRequestOperation. In this case it is allowed (and thus works) because you have provided an explicit list and no lookup is required.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top