iOS RestKit人工识别属性

时间:2013-09-18 14:04:03

标签: ios core-data restkit restkit-0.20

已关联RestKit issue #1604

如果我的API没有给我id属性,但我仍想通过核心数据缓存对象,我应该用什么来识别我的对象。 例如我有

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

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

我无法声明映射以从responseID填充[translation.text md5hash]属性以用作responseMapping.identificationAttributes = @[ responseID ];,因为映射没有此类功能。

4 个答案:

答案 0 :(得分: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"];
}

答案 1 :(得分:1)

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

    entityMapping.identificationAttributes = @[ @"text",@"dictionary",@"lang",@"author",@"date" ];

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

  • 您将CoreData与RestKit(RKEntityMapping,托管对象等)一起使用
  • 您为实体提供良好的识别属性。它可以是来自@metadata的请求的网址。
  • 来自success的{​​{1}}和failure回调,查询带有获取请求的CoreData,并以同样的方式返回结果 好像它是直接加载并从getObjectsAtPath获取并将其标记为缓存(如果旧的结果已加载失败