Question

On my main controller, the RESTKIT is working fine:

My code and response descriptor looks like this:

// register mappings with the provider using a response descriptor
RKResponseDescriptor *responseDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:workOrderMapping
                                             method:RKRequestMethodGET
                                        pathPattern:@"/api/workorder/GetWorkOrderListSimple"
                                            keyPath:nil
                                        statusCodes:nil];

[objectManager addResponseDescriptor:responseDescriptor];


[[RKObjectManager sharedManager] getObjectsAtPath:@"/api/workorder/GetWorkOrderListSimple"
                                       parameters:nil
                                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                              NSLog(@"It Worked");
                                              _workOrders = mappingResult.array;
                                              [self.tableView reloadData];
                                          }
                                          failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                              NSLog(@"error': %@", error);
                                          }];

So this first call works fine, however, on my 2nd controller, it seems to be somehow reusing this old response descriptor, I created a new one, but in the error message it's still referencing GetWorkOrderListSimple, when I clearly told it to use GetWorkOrderDetail.

RKResponseDescriptor *responseDescriptor =
    [RKResponseDescriptor responseDescriptorWithMapping:workOrderBigMapping
                                                 method:RKRequestMethodGET
                                            pathPattern:@"/api/workorder/GetWorkOrderDetail"
                                                keyPath:nil
                                            statusCodes:nil];

However for some reason, here is my error message, can anyone point me in the right direction for debugging? Thanks!!!

A 200 response was loaded from the URL 'http://xxxxxxx.ws/api/workorder/GetWorkOrderDetail?workOrderId=116194', which failed to match all (1) response descriptors: http://xxxxxxx.ws pathPattern=/api/workorder/GetWorkOrderListSimple statusCodes=(null)> failed to match: response path '/api/workorder/GetWorkOrderDetail?workOrderId=116194' did not match the path pattern '/api/workorder/GetWorkOrderListSimple'.

I have the same "loading" or "setup" code in the Viewdidload of each view controller, there are two view controllers

I call configureRestKit in every Viewdidload, should I not? Should this be in the app delegate or somewhere else?

I thought since I was configuring the kit in each view controller viewdidload it would be a fresh one every time

- (void)configureRestKit
{
    // initialize AFNetworking HTTPClient
    NSURL *baseURL = [NSURL URLWithString:@"http://xxxxxxxx.ws"];
    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];

    // initialize RestKit
    RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client];

    // setup object mappings
    RKObjectMapping *workOrderBigMapping = [RKObjectMapping mappingForClass:[WorkOrderBig class]];
    [workOrderBigMapping addAttributeMappingsFromArray:@[@"WorkOrderId", @"Job", @"Address", @"Supervisor", @"PO", @"Priority", @"Status", @"ReceivedDate"]];

    RKObjectMapping *workOrderDetailMapping = [RKObjectMapping mappingForClass:[WorkOrderDetail class]];
    [workOrderDetailMapping addAttributeMappingsFromArray:@[@"WorkOrderDetailId", @"WorkOrderId", @"WorkOrderProblemId", @"DetailDescription", @"ProductId", @"Qty", @"PONumber", @"Code", @"ProductDescription", @"UOM", @"Price", @"OriginalPrice", @"PctMarkup", @"LineItem", @"OriginalTotal", @"TotalPrice"]];

    RKObjectMapping *workOrderProblemMapping = [RKObjectMapping mappingForClass:[WorkOrderProblem class]];
    [workOrderProblemMapping addAttributeMappingsFromArray:@[@"WorkOrderId", @"WorkOrderProblemId", @"Description", @"SpanishDescription", @"Action", @"LineItem"]];

    //Define Relationships
    [workOrderBigMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"Details"
                                                                                   toKeyPath:@"Details"
                                                                                 withMapping:workOrderBigMapping]];

    [workOrderBigMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"Problems"
                                                                                     toKeyPath:@"Problems"
                                                                                   withMapping:workOrderProblemMapping]];


    // register mappings with the provider using a response descriptor
    RKResponseDescriptor *responseDescriptor =
    [RKResponseDescriptor responseDescriptorWithMapping:workOrderBigMapping
                                                 method:RKRequestMethodGET
                                            pathPattern:@"/api/workorder/GetWorkOrderDetail"
                                                keyPath:@"/api/workorder/GetWorkOrderDetail"
                                            statusCodes:nil];

    [objectManager addResponseDescriptor:responseDescriptor];


- (void)loadWorkOrders
{
    NSString *WorkOrderId = [NSString stringWithFormat:@"%i", _workOrderId];


    NSMutableDictionary *params =[[NSMutableDictionary alloc] init];
    [params setValue:WorkOrderId forKey:@"workOrderId"];

    [[RKObjectManager sharedManager] getObjectsAtPath:@"/api/workorder/GetWorkOrderDetail"
                                           parameters:params
                                              success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                                  NSLog(@"It Worked");
                                                  _workOrders = mappingResult.array;

                                                  //paint screen
                                                  WorkOrderBig *mainWorkOrder = [_workOrders objectAtIndex:0];
                                                  self.lblWorkOrderId.text = mainWorkOrder.WorkOrderId;

                                              }
                                              failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                                  NSLog(@"What do you mean by 'there is no coffee?': %@", error);
                                              }];
}
Was it helpful?

Solution

I call configureRestKit in every Viewdidload, should I not?

Based on your configuration, yes, you should

Should this be in the app delegate or somewhere else?

No, the app delegate is for application level event management, not data configuration

So, your configuration is almost fine, the problem is your usage: [RKObjectManager sharedManager]. When you call sharedManager you will always get back the first object manager that was created - not the one that was 'locally' created.

You should be using an @property on each of your view controllers to store the objectManager that they create and then using self.objectManager instead of [RKObjectManager sharedManager].

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