2014-01-27 47 views
2

孤立的对象此刻的我与Orphaned objects删除挣扎。 我有以下类。删除在restKit 0.20

映射类

在这个类中创建我的所有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类

在这个类我做我的请求,还尝试删除孤立的对象。

-(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不会被删除。我是在做一些错误的事情还是没有正确设置?

感谢您的帮助!

+0

什么记录?获取块是否运行?如果运行,模式匹配是什么?你为什么要明确使用'RKManagedObjectRequestOperation'而不必经理发出请求? – Wain

+0

为应对后期@Wain遗憾。但看起来,获取块没有运行。安妮的想法怎么可能? – Steaphann

回答

1

看为RKObjectManager managedObjectRequestOperationWithRequest:代码示出了读取请求块从对象管理器通过传递给操作。因此,需要调试才能确定它未被调用的原因。它应该在所有'成功'场景中被调用(即响应描述符与接收到的响应相匹配的场景)。

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


尝试改变读取请求块:

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

看来我进入了获取请求块。但他没有找到一个匹配。我正在寻找这一段时间,但似乎并没有得到它的工作。也许有任何想法? – Steaphann