在 restKit 0.20 中删除孤立对象

Posted

技术标签:

【中文标题】在 restKit 0.20 中删除孤立对象【英文标题】:Deletion of Orphaned objects in restKit 0.20 【发布时间】:2014-01-27 08:24:50 【问题描述】:

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

映射器类

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


网络服务类

在这个类中,我执行我的请求并尝试删除孤立对象。

-(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 未被删除。我做错了什么还是设置不正确?

感谢您的帮助!

【问题讨论】:

记录了什么?提取块是否运行?如果运行,模式是否匹配?为什么要明确使用RKManagedObjectRequestOperation 而不是让经理提出请求? @Wain 抱歉回复晚了。但似乎 fetch 块没有运行。知道这怎么可能吗? 【参考方案1】:

查看RKObjectManager managedObjectRequestOperationWithRequest: 的代码表明获取请求块是从传递给操作的对象管理器传递的。因此,需要调试才能弄清楚为什么没有调用它。它应该在所有“成功”场景(即响应描述符与接收到的响应匹配的场景)中调用。

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


尝试更改获取请求块:

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

【讨论】:

似乎我进入了获取请求块。但他没有找到匹配的。我在这之后搜索了一段时间,但似乎没有让它工作。有什么想法吗?

以上是关于在 restKit 0.20 中删除孤立对象的主要内容,如果未能解决你的问题,请参考以下文章

Restkit - 删除具有相同 URL 路径的孤立对象

RestKit、NSFetchedResultsController 和删除孤立对象

如果服务器错误 401,防止 Restkit 删除孤立对象

让 RestKit 离开特定的孤立 CoreData 托管对象

使用 RestKit 0.20 的对象映射关系

RestKit 0.20:restkit 对象映射使属性映射加倍