我在如下结构中实现了一个简单的 REST 请求:
RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]];
operation.targetObject = nil;
operation.savesToPersistentStore = YES;
operation.managedObjectContext = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
operation.managedObjectCache = [RKManagedObjectStore defaultStore].managedObjectCache;
[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) {
// Handle success
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
// Handle failure
}];
如何修改代码以便:
- 如果成功,我需要清空 DB 上的相关实体,并将其内容替换为从 WS 到达的新实体(不更新,替换全部内容);
- 如果出现故障,则不应发生任何事情,数据库中的实体必须保持原样。
为了删除数据库实体,在操作之前我会按照此处报告的那样进行操作: Core Data: Quickest way to delete all instances of an entity , 但无论 WS 答案是什么,这都会清空实体。
非常感谢任何帮助, 多谢, 丹
编辑 1:
按照@Wain 的建议,我在操作中添加了一个获取请求 block ,如下所示:
RKFetchRequestBlock fetchRequestBlock = ^NSFetchRequest *(NSURL *URL)
{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"EntityToBeUpdated"];
fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"order" ascending:NO] ];
return fetchRequest;
};
operation.fetchRequestBlocks = @[fetchRequestBlock];
operation.deletesOrphanedObjects = YES;
但结果没有改变:数据库中的项目没有更新或删除。
最佳答案
RestKit 是基于更新而不是替换。因此,您的要求在映射过程中很难管理。您可以考虑:
- 让 RestKit 创建一个新实例并在成功 block 中删除旧实例 - 短时间内重复对象。
- 在映射开始之前使用动态映射检查响应,以决定是否删除 - 有点 hacky。
- 让 JSON 响应包含所有键的值,这样所有内容都会被覆盖。
从错误的角度来看,如果错误返回时带有 HTTP 状态代码,并且您没有该代码的响应描述符,那么 RestKit 将不会改变任何内容。
根据您下面的评论,您实际上正在寻找孤立项目删除。这是使用获取请求 block 完成的。请参阅获取请求 block 和删除孤立对象部分
here 。您不需要谓词,只需要一个获取请求。
关于ios - RestKit + CoreData : replace entity content in case of operation success, 在失败的情况下保持原样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21305600/