Deletion of Orphaned objects in restKit 0.20

606 views Asked by At

At the moment I'm struggling with the deletion of Orphaned objects. I've the following classes.

MAPPER CLASS

In this class I create all my RKObjectManagers and use it in my other classes.

-(RKObjectManager *)mapAppointments{
    RKEntityMapping* appointmentMapping = [RKEntityMapping mappingForEntityForName:@"Appointment" inManagedObjectStore:managedObjectStore];
    appointmentMapping.identificationAttributes = @[@"app_id",@"app_start"] ;
    [appointmentMapping addAttributeMappingsFromDictionary:@{
                                                       @"AddressInfo": @"app_addressinfo",
                                                       @"Completed": @"app_completed",
                                                       @"Description": @"app_description",
                                                       @"EndDate":@"app_end",
                                                       @"FullDay": @"app_fullday",
                                                       @"Id":@"app_id",
                                                       @"Label": @"app_label",
                                                       @"LabelId": @"app_label_id",
                                                       @"Location": @"app_location",
                                                       @"Private":@"app_private",
                                                       @"ProjectName":@"app_project_name",
                                                       @"ProjectNumber": @"app_project_number",
                                                       @"RecurrenceInfo": @"app_recurrenceInfo",
                                                       @"RelationAddressCity": @"app_relation_address_city",
                                                       @"RelationAddressId":@"app_relation_address_id",
                                                       @"RelationAddressName": @"app_relation_address_name",
                                                       @"RelationAddressStreet":@"app_relation_address_street",
                                                       @"RelationCode": @"app_relation_code",
                                                       @"RelationContactPersonId": @"app_relation_contact_id",
                                                       @"RelationContactPersonName": @"app_relation_contact_name",
                                                       @"RelationName":@"app_relation_name",
                                                       @"ReminderInfo":@"app_reminder_info",
                                                       @"StartDate": @"app_start",
                                                       @"State": @"app_state",
                                                       @"Subject": @"app_subject",
                                                       @"SupplierCode":@"app_supplier_code",
                                                       @"SupplierContactPersonId": @"app_supplier_contact_person_id",
                                                       @"SupplierContactPersonName":@"app_supplier_contact_person_name",
                                                       @"SupplierName": @"app_supplier_name",
                                                       @"Type": @"app_type",
                                                       @"ResxPers":@"app_resxPers",
                                                       }];







    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:appointmentMapping pathPattern:nil keyPath:@"" statusCodes:[NSIndexSet indexSetWithIndex:200]];
    NSArray *arrResponsDescriptor = [[NSArray alloc]initWithObjects:responseDescriptor,nil];

    [objectManager addResponseDescriptorsFromArray:arrResponsDescriptor];
    return objectManager;

}

WEBSERVICE CLASS

In this class I do my request and also try to delete the Orphaned objects.

-(void)fetchAppointmentsOnCompletionFor:(NSDate *)start andEnd:(NSDate *)end OnCompletion:(myCompletion) compblock{
    Mapper *mapper = [Mapper new];
    RKManagedObjectStore *store = [[AdsolutDataModel sharedDataModel] objectStore];
    NSLog(@"store is %@",store);
    NSManagedObjectContext *context = store.mainQueueManagedObjectContext;
    RKObjectManager *objectManager = [mapper mapAppointments];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];
    [dateFormatter  setDateFormat:@"dd-MM-yyyy"];
    NSString *strStart = [dateFormatter stringFromDate:start];
    NSString *strEnd = [dateFormatter stringFromDate:end];

    NSString *userName = [[NSUserDefaults standardUserDefaults]valueForKey:@"userName"];
    NSString *hash = [[NSUserDefaults standardUserDefaults]valueForKey:@"hash"];
    NSString *urlString = [NSString stringWithFormat:@"getcrmappointments?gebrcode=%@&token=%@&startdate=%@&enddate=%@",userName,hash,strStart,strEnd];


    [objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {

        RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:urlString];

        NSDictionary *argsDict = nil;
        BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict];

        if (match) {
            NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Appointment"];
            fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(app_start >= %@) AND (app_end <= %@)", start,end]; // NOTE: Coerced from string to number
            fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"app_id" ascending:YES] ];
            return fetchRequest;
        }

        return nil;
    }];

    NSURLRequest *request = [objectManager requestWithObject:nil method:RKRequestMethodGET path:urlString parameters:nil];
    RKManagedObjectRequestOperation *operation = [objectManager managedObjectRequestOperationWithRequest:request managedObjectContext:context success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        NSLog(@"REQUEST URL = %@",request.URL);
        NSError *error = nil;
        BOOL success = [context  save:&error];
        if (!success) RKLogWarning(@"Failed saving managed object context: %@", error);
        NSLog(@"SUCCESS");
        NSError *saveError = nil;

        for (Appointment *appointment in mappingResult.array) {
            NSLog(@"Appointment title is %@",appointment.app_subject);
            appointment.synchronized = @1;
            appointment.app_delete = @0;
            [context saveToPersistentStore:&saveError];

        }

        [self fetchAfwezighedenOnCompletionFor:start andEnd:end OnCompletion:^(BOOL finished) {
            if(finished){
                compblock(YES);
            }
        }];

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:[error localizedDescription]
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        NSLog(@"Hit error: %@", error);
    }];
    [objectManager enqueueObjectRequestOperation:operation];
}

PROBLEM

At the moment, the Orphaned objects are not deleted. Am I doing somehting wrong or is something not setup right ?

Thanks for the help !

1

There are 1 answers

1
Wain On

Looking at the code for RKObjectManager managedObjectRequestOperationWithRequest: shows that the fetch request blocks are passed from the object manager passed to the operation. So, debugging would be required to work out why it wasn't called. It should be called in all 'success' scenarios (i.e. ones where a response descriptor matches the received response).

You could look at using the manager to make the request instead of getting a request and using RKManagedObjectRequestOperation, but in theory this should simply be less code to write rather than a functional difference.


Try changing the fetch request block:

RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"getcrmappointments"];