2

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 !

Steaphann
  • 2,797
  • 6
  • 50
  • 109
  • What is logged? Is the fetch block run? If run, is the pattern matching? Why are you explicitly using `RKManagedObjectRequestOperation` instead of having the manager make the request? – Wain Jan 27 '14 at 11:45
  • @Wain sorry for the late response. But it seems that the fetch block is not getting runned. Anny idea how this is possible ? – Steaphann Feb 05 '14 at 13:44

1 Answers1

1

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"];
Wain
  • 118,658
  • 15
  • 128
  • 151
  • It seems that I get inside the fetch request block. But he did not find a match. I'm searching after this for a while but don't seem to get it working. Any idea maybe ? – Steaphann Feb 05 '14 at 16:02