ios - RestKit + CoreData : replace entity content in case of operation success, 在失败的情况下保持原样

标签 ios rest core-data restkit

我在如下结构中实现了一个简单的 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 是基于更新而不是替换。因此,您的要求在映射过程中很难管理。您可以考虑:

  1. 让 RestKit 创建一个新实例并在成功 block 中删除旧实例 - 短时间内重复对象。
  2. 在映射开始之前使用动态映射检查响应,以决定是否删除 - 有点 hacky。
  3. 让 JSON 响应包含所有键的值,这样所有内容都会被覆盖。

从错误的角度来看,如果错误返回时带有 HTTP 状态代码,并且您没有该代码的响应描述符,那么 RestKit 将不会改变任何内容。


根据您下面的评论,您实际上正在寻找孤立项目删除。这是使用获取请求 block 完成的。请参阅获取请求 block 和删除孤立对象部分 here 。您不需要谓词,只需要一个获取请求。

关于ios - RestKit + CoreData : replace entity content in case of operation success, 在失败的情况下保持原样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21305600/

相关文章:

ios - 自定义 UITextField 中的边框宽度和占位符

iOS 5.1 在使用 Collection View 时崩溃

android - 功能来知道是平板电脑,iPad,智能手机?

django-piston:DELETE 处理程序中的 request.data 可用性

swift - 从 CoreData 中删除字符串

c# - 为 Xamarin 重定向 UIViewController

java - 在 DropWizard 中禁用 Swagger Bundle

ios - RestKit:当值无效时如何拒绝整个映射

objective-c - 巨大的核心数据对象

objective-c - iOS 核心数据 - 段错误 11