RESTKit DELETE请求在2xx成功时不删除本地对象

时间:2014-09-29 10:13:53

标签: restkit-0.20

根据0.20 RK的文件:

RKManagedObjectRequestOperation adds special behavior to DELETE requests. Upon retrieving a successful (2xx status code) response for a DELETE, the operation will invoke deleteObject: with the operations targetObject on the managed object context. This will delete the target object from the local store in conjunction the successfully deleted remote representation.

我一直试图用这样的请求删除一个对象,但无论我尝试什么,我似乎无法让它工作。我成功地执行了许多对象的请求,这些对象被映射到适当的类,并存储在核心数据中。当我在其中一个对象上尝试删除请求并获得200次成功时,它不会从本地存储中删除。

这是一些代码,我毫无疑问会错过一个技巧。

AppDelegate.m

...
//
// Match Mapping
//
RKEntityMapping *matchMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Match class])
                                                       inManagedObjectStore:objectManager.managedObjectStore];
NSDictionary *matchAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                        @"objectId", @"id",
                                           @"score", @"matchScore",
                                           @"date", @"matchDate",
                                           nil];
matchMapping.identificationAttributes = @[@"objectId"];
[matchMapping addAttributeMappingsFromDictionary:matchAttributes];

// Response descriptor for GET
[objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:matchMapping
                                                                                  method:RKRequestMethodGET
                                                                             pathPattern:@"match/"
                                                                                 keyPath:@"matches"
                                                                             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];
// Response Descriptor for PUT
[objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:matchMapping
                                                                                  method:RKRequestMethodPUT
                                                                             pathPattern:@"match/"
                                                                                 keyPath:@"match"
                                                                             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];

// Request Descriptor for DELETE
[objectManager addRequestDescriptor:[RKRequestDescriptor requestDescriptorWithMapping:[matchMapping inverseMapping]
                                                                          objectClass:[Match class]
                                                                          rootKeyPath:nil
                                                                               method:RKRequestMethodDELETE]];

MatchDetailVC.m

...
- (void)deleteMatch {

NSDictionary *requiredParameters = @{
                                     @"APIKey": @"xxxxx"
                                     };

NSMutableURLRequest *request = [[RKObjectManager sharedManager] requestWithObject:self.match
                                                                           method:RKRequestMethodDELETE
                                                                             path:@"match/"
                                                                       parameters:requiredParameters];

RKManagedObjectRequestOperation *operation = [[RKObjectManager sharedManager]
                                              managedObjectRequestOperationWithRequest:request
                                              managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext
                                              success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                                  //[[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext save:nil]; // IS THIS NEEDED?
                                                  NSLog(@"Successfully deleted match.");
                                                  [self.navigationController popToRootViewControllerAnimated:YES];
                                              }
                                              failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                                  NSLog(@"Error: %@", [error localizedDescription]);
                                              }];

 NSOperationQueue *operationQueue = [NSOperationQueue new];
 [operationQueue addOperation:operation];
}
...

提前致谢,如果您需要更多代码,请与我们联系。 安迪

1 个答案:

答案 0 :(得分:0)

我知道这是一个很老的帖子,但这是我在寻找年龄后发现的......

如果DELETE响应没有有效的响应映射,则本地删除将失败。 当我创建一个像这样的空响应映射时,问题就不再存在了:

  RKObjectMapping* nullMapping = [RKObjectMapping mappingForClass:[NSNull class]];
    [objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:nullMapping method:RKRequestMethodDELETE pathPattern:@"mybase/something/:myid/" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];