Search code examples
iphoneobjective-ciosrestkitobjective-c-blocks

Objects not loading on second request in Restkit


I'm sending off 2 requests simultaneously with Restkit and I receive a response back from both of them, but only one of the requests receives any objects. If I send them off one by one, then my objectloader receives all objects.

First request:

self.firstObjectManager = [RKObjectManager sharedManager];
[self.firstObjectManager loadObjectsAtResourcePath:[NSString stringWithFormat: @"/%@.json", subUrl] usingBlock:^(RKObjectLoader *loader){
    [loader.mappingProvider setObjectMapping:designArrayMapping forKeyPath:@""];
    loader.userData = @"design";
    loader.delegate = self;
    [loader sendAsynchronously];
}];

Second request:

self.secondObjectManager = [RKObjectManager sharedManager];
[self.secondObjectManager loadObjectsAtResourcePath:[NSString stringWithFormat: @"/%@.json", subUrl] usingBlock:^(RKObjectLoader *loader){
    [loader.mappingProvider setObjectMapping:designerMapping forKeyPath:@""];
    loader.userData = @"designer";
    loader.delegate = self;
    [loader sendAsynchronously];
}];

My objecloader:

-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
    //NSLog(@"This happened: %@", objectLoader.userData);
    if (objectLoader.userData == @"design") {
        NSLog(@"Design happened: %i", objects.count);
    }else if(objectLoader.userData == @"designer"){
        NSLog(@"designer: %@", [objects objectAtIndex:0]);
    }

}

My response:

2012-11-18 14:36:19.607 RestKitTest5[14220:c07] Started loading of request: designer
2012-11-18 14:36:22.575 RestKitTest5[14220:c07] I restkit.network:RKRequest.m:680:-[RKRequest updateInternalCacheDate] Updating cache date for request <RKObjectLoader: 0x95c3160> to 2012-11-18 19:36:22 +0000
2012-11-18 14:36:22.576 RestKitTest5[14220:c07] response code: 200
2012-11-18 14:36:22.584 RestKitTest5[14220:c07] Design happened: 0
2012-11-18 14:36:22.603 RestKitTest5[14220:c07] I restkit.network:RKRequest.m:680:-[RKRequest updateInternalCacheDate] Updating cache date for request <RKObjectLoader: 0xa589b50> to 2012-11-18 19:36:22 +0000
2012-11-18 14:36:22.605 RestKitTest5[14220:c07] response code: 200
2012-11-18 14:36:22.606 RestKitTest5[14220:c07] designer: <DesignerData: 0xa269fc0>

Update: Setting my base url

RKURL *baseURL = [RKURL URLWithBaseURLString:@"http://iphone.meer.li"];
[RKObjectManager setSharedManager:[RKObjectManager managerWithBaseURL:baseURL]];

Solution

Problem was that I used the shared manager for both object managers, so I ended up doing:

RKURL *baseURL = [RKURL URLWithBaseURLString:@"http://iphone.meer.li"];
RKObjectManager *myObjectManager = [[RKObjectManager alloc] initWithBaseURL:baseURL];
self.firstObjectManager = myObjectManager;

and:

RKURL *baseURL = [RKURL URLWithBaseURLString:@"http://iphone.meer.li"];
RKObjectManager *myObjectManager = [[RKObjectManager alloc] initWithBaseURL:baseURL];
self.secondObjectManager = myObjectManager;

Solution

  • Use block syntax for loading,

    self.secondObjectManager = [RKObjectManager sharedManager];
    [self.secondObjectManager loadObjectsAtResourcePath:[NSString stringWithFormat: @"/%@.json", subUrl] usingBlock:^(RKObjectLoader *loader){
        [loader.mappingProvider setObjectMapping:designerMapping forKeyPath:@""];
        loader.userData = @"designer";
         loader.onDidLoadObjects = ^(NSArray *objects){
             NSLog(@"Loaded objects %@", objects);
          };
         loader.onDidFailedWithError = ^(NSError *error){
            NSLog(@"Failed with error %@", error.userInfo);
       }
    }];
    

    Edit

    Use your own object manager and retain it and then use it this way,

    Do not use sharedManager instead alloc/init it and provide it objectstore and see. Hope this helps you,

    [self.objectManager loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader){
            [loader.mappingProvider setMapping:[MyClass mapping] forKeyPath:@""];
            loader.onDidLoadObjects = ^(NSArray *objects){
    
            };
            loader.onDidLoadResponse = ^(RKResponse *response){
                NSLog(@"Loaded response %@", response.bodyAsString);
            };
            loader.onDidFailLoadWithError = ^(NSError *error){
                NSLog(@"Error occurred ... %@", error.userInfo);
    
            };
        }];