RestKit + CoreData :如何在远程保存成功后在本地保存对象



我正在iOS 5.0部署目标上使用RestKit 0.10.1和Core Data来构建与自定义RESTFul API接口的应用程序。由于离线连接很重要,因此我在设备上的本地 CoreData 数据库中维护用户数据的缓存。

现在,RestKit非常棒,设置RKFetchResultsTableController来轻松显示和持久化我的数据是相当轻松的。但是,RestKit 的一种行为似乎并不理想,我不知道如何改变。

我有一个名为"录制"的模型。要创建新的录音,我正在执行以下操作:

 Recording *r = [NSEntityDescription insertNewObjectForEntityForName:@"Recording" inManagedObjectContext:[[RKObjectManager sharedManager].objectStore managedObjectContextForCurrentThread]];
 r.name = newName; 
[[RKObjectManager sharedManager] sendObject:r toResourcePath:@"/recordings" usingBlock:^(RKObjectLoader *loader){
        loader.delegate = self; 
        loader.method = RKRequestMethodPOST;
        loader.serializationMIMEType = RKMIMETypeJSON;  
        loader.serializationMapping = [RKObjectMapping serializationMappingUsingBlock:^(RKObjectMapping *serializationMapping){
            [serializationMapping mapAttributes:@"name", nil];
        }];
        RBMappingProvider *mappings = (RBMappingProvider *)[[RKObjectManager sharedManager] mappingProvider];
        loader.objectMapping = [mappings recordingObjectMapping];
    }];

这将创建一个类型为"录制"的新实体,然后在 POST 请求中将该实体发送到服务器。在成功的案例中,这很好用。

但是,问题是服务器有时会合法地拒绝这些创建。在这些情况下,我发现核心数据数据库中已经有一个 id 为 0 的实体本地副本(id 是服务器设置的主键)。

删除本地实体的唯一方法是强制从服务器刷新本地数据。

有没有办法仅在服务器以 2xx 响应时才在本地保留对象?或者,如果服务器响应 2xx 以外的任何内容,有没有办法撤消更改?

谢谢

遗憾的是,由于录制是 NSManagedObject,因此即使临时实例也需要插入到托管对象上下文中。 @Mundi维护引用并在错误后将其从上下文中删除的解决方案是我会使用的解决方案。一些额外的代码胜过从服务器完全刷新。

升级到 0.20.x 将使此操作更容易。发送请求时使用的成功和失败块使得保留此引用并在失败时将其删除变得非常容易。例如:

[_objectManager postObject:aMessage
                      path:@"message"
                parameters:parameters
                   success:^(RKObjectRequestOperation * operation, RKMappingResult * mappingResult){
                     // Success code here
                   }
                   failure:^(RKObjectRequestOperation * operation, NSError * error){
                     [_managedObjectContext deleteObject:aMessage];
                     [_managedObjectContext save:nil];
                   }];

最新更新