删除restKit 0.20中的孤立对象

时间:2014-01-27 08:24:51

标签: ios iphone objective-c restkit rkobjectmapping

目前我正在努力删除Orphaned objects。 我有以下课程。

MAPPER CLASS

在这个类中,我创建了所有的RKObjectManagers并在其他类中使用它。

-(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

在这个课程中,我做了我的请求,并尝试删除孤立的对象。

-(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];
}

问题

目前,Orphaned objects不会被删除。我做错了什么或者设置不正确?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

查看RKObjectManager managedObjectRequestOperationWithRequest:的代码表明,从传递给操作的对象管理器传递了获取请求块。因此,需要进行调试以找出未调用的原因。它应该在所有“成功”场景中调用(即响应描述符与接收到的响应匹配的场景)。

您可以查看使用管理器发出请求而不是获取请求并使用RKManagedObjectRequestOperation,但理论上这应该只是编写更少的代码而不是功能差异。


尝试更改获取请求块:

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