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

Posted

技术标签:

【中文标题】RestKit:当值无效时如何拒绝整个映射【英文标题】:RestKit: How to reject an entire mapping when a value is not valid 【发布时间】:2014-10-23 19:21:46 【问题描述】:

所以我正在尝试支持离线使用我正在制作的使用 REST API 的 ios 应用程序。到目前为止,这是我所拥有的:

使用 REST 接口运行以操作我的数据模型的服务器。 一个使用 RestKit 检索存储在我的服务器上的数据的 iOS 应用程序。 RestKit 在 Core Data 中本地存储服务器响应。

当服务器不可用时,我仍然希望用户能够更新数据模型,然后当服务器再次可用时,我希望将这些更新推送到服务器。

我遇到的问题是,当从服务器接收到已在本地更新(但尚未推送到服务器)的值时,它会被服务器响应的内容覆盖。为了防止这种情况发生,如果新的“updatedAt”日期早于当前的“updatedAt”日期,我将尝试取消保存到本地存储。

这是我当前的验证功能:

- (BOOL)validateUpdatedAt:(id *)ioValue error:(NSError **)outError

    if(self.updatedAt && [self.updatedAt compare:((NSDate *)*ioValue)] == NSOrderedDescending) 

        *outError = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorMappingDeclined userInfo:nil];

        return NO;
    
    return YES;

这可行,但只能防止更改此单个值。如果该字段无效,我希望取消该对象的整个更新。我该怎么做?

【问题讨论】:

【参考方案1】:

RestKit 提供的支持是设置discardsInvalidObjectsOnInsert 以在验证失败时丢弃整个对象。但是,这对您不起作用,因为它仅适用于正在插入的 NSManagedObject 实例,因为它使用 validateForInsert:

您可以考虑使用 validateForUpdate: 执行类似的检查,然后恢复更改,但在您的案例中,RestKit 并没有真正为您提供任何关于中止的信息。

【讨论】:

是的,这基本上是我得出的结论。在那里检查还原感觉有点太笨拙了,所以我决定改变我提出请求的方式,以改善整体系统。我现在使用的是两个日期系统 - 一个日期仅从服务器更新,一个日期在每次本地发生更改时更新。它实际上来自您在this 线程中的回复。

以上是关于RestKit:当值无效时如何拒绝整个映射的主要内容,如果未能解决你的问题,请参考以下文章

RestKit - 从 RKRequestDescriptor 中排除具有 nil 值的属性映射

RestKit映射成功后如何访问对象

使用 RESTKIT 0.20 映射未命名值的 JSON 数组

当我有对象根时如何使用 RestKit 的对象映射?

RestKit 对象映射与外键和服务

没有关键路径的 Reskit 映射数组