Ios RestKit&x2B;CoreData:如何仅在远程保存成功后在本地保存对象?

Ios RestKit&x2B;CoreData:如何仅在远程保存成功后在本地保存对象?,ios,core-data,restkit,Ios,Core Data,Restkit,我在iOS 5.0部署目标上使用具有核心数据的RestKit 0.10.1来构建一个与自定义RESTFul API接口的应用程序。由于离线连接很重要,我正在设备上的本地CoreData数据库中维护用户数据的缓存 现在,RestKit非常棒,设置RKFetchResultsTableController以轻松显示和持久保存我的数据非常容易。然而,RestKit有一个行为似乎并不理想,我不知道如何改变它 我有一个叫“录音”的模型。要创建新录音,我将执行以下操作: Recording *r = [N

我在iOS 5.0部署目标上使用具有核心数据的RestKit 0.10.1来构建一个与自定义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];

    }];
这将创建一个类型为“Recording”的新实体,然后在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];
                   }];

FWIW,按照RestKit文档中的规定创建带有Recording*r=[Recording object]的实体并不会改变任何行为。在RK中,服务器响应没有回调方法吗?保留对对象的引用,如果上载被拒绝,则将其删除。@mundi这是一种方法,甚至可能是更可取的方法。但是,我想知道是否只有在服务器接受有效负载后才可能保持本地状态。这将大大减少冗余代码。