我在 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 请求中将该实体发送到服务器。在成功案例中,这很有效。
但是,问题是服务器有时会合法地拒绝这些创建。我在这些情况下发现,Core Data 数据库中已经存在实体的本地副本,其 id 为 0(id 是由服务器设置的主键)。
删除本地实体的唯一方法是强制从服务器刷新本地数据。
有没有办法在服务器以 2xx 响应时仅在本地持久保存对象?或者,如果服务器响应不是 2xx,有没有办法撤消更改?
谢谢,
最佳答案
不幸的是,因为 Recording 是一个 NSManagedObject,所以即使是临时实例也需要插入到托管对象上下文中。 @Mundi 维护引用并在错误发生后将其从上下文中删除的解决方案是我将使用的解决方案。一些额外的代码胜过从服务器完全刷新。
升级到 0.20.x 将使这更容易。发送请求时使用的成功和失败 block 使得保留此引用并在失败时删除它变得非常容易。例如:
[_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];
}];
关于ios - RestKit + 核心数据 : How to save an object locally only after the remote save is successful?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10957628/