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 !
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: