2

链接RestKit 问题 #1604

如果我的 API 没有给我任何id属性,但我仍然想通过 Core Data 缓存对象,我应该使用什么来识别我的对象。例如我有

response =  {
  translation =     {
          text = "longlongtext";
          dictionary = "general";
          lang = "en";
      };
  otherdata =     {
          author = "May";
          date = "434134";
      };
}

所以我很乐意使用散列(md5)翻译文本作为 id 字符串。请注意,我未来在没有网络连接的情况下发生的请求应该能够识别这个缓存的实体并将其作为结果。

我不能声明映射来填充responseID属性,[translation.text md5hash]因为responseMapping.identificationAttributes = @[ responseID ];映射没有这样的功能。

4

4 回答 4

3

正如@segiddins 在github问题讨论中提出的:

...在您的托管对象子类中,挂钩到核心数据回调之一以生成一个复合键,该键被保存为模型的一部分,并且只需将该键用作您的标识属性。

该方法可能如下所示:

@property (nonatomic, copy) NSString *identifier;


- (void)willSave
{
    [super willSave];

    NSString *computedIdentifier = [[NSString stringWithFormat:@"%@%@", self.text, self.langCode] md5hash];
    [self setPrimitiveValue:computedIdentifier forKey:@"identifier"];
}
于 2013-12-02T09:47:57.213 回答
1

我也想像JSON你一样对字段进行哈希处理,但你知道这是不可能的。我最终做了以下事情来实现(我相信)相同的最终结果,即对于JSON没有唯一 ID 返回的对象,RestKit 会生成一个唯一标识属性:

    entityMapping.identificationAttributes = @[ @"text",@"dictionary",@"lang",@"author",@"date" ];
于 2013-11-16T12:02:09.993 回答
0

如果您没有服务器提供的标识符,您应该将这种功能保留在 RestKit 之外。

我会为您发出的每个请求(GUID)生成一个自定义标识符,我会将该标识符保存到 RestKit 成功完成块中的每个结果对象中。我还将请求详细信息和标识符保存到用户默认值中。

现在,当用户发出请求并且他们处于离线状态时,您可以分析用户默认值以确定它是否是重复请求并找到用于从数据存储中查询结果的标识符。

于 2013-09-19T11:38:34.703 回答
0

只是为了在讨论后澄清离线请求。最后,RestKit 内部不存在这样的功能(离线请求)。实现它的方式很复杂,但可能。步骤是:

  • 您将 CoreData 与 RestKit 一起使用(RKEntityMapping、托管对象等)
  • 您为实体提供了良好的标识属性。它可以是来自的请求的 URL @metadata
  • 在这两个successfailure回调中,getObjectsAtPath您使用 fetch 请求查询CoreData 并返回结果,就像直接加载并从中获取结果一样,如果它是在失败mappingResult.firstObject时加载的旧结果,则将其标记为缓存。
于 2014-02-24T13:59:05.410 回答