【问题标题】:iOS RestKit artificial identification attributesiOS RestKit 人工识别属性
【发布时间】:2013-09-18 14:04:02
【问题描述】:

链接RestKit issue #1604

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

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

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

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

【问题讨论】:

  • 所以您真正关心的是匹配现有数据以进行离线请求?
  • @Wain 是的,这就是我真正关心的。

标签: ios core-data restkit restkit-0.20


【解决方案1】:

@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"];
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 感谢您的回复。这很有意义。但我想澄清一下:我浏览了资源:
      • 我浏览了资源:github.com/RestKit/RestKit/wiki/Object-mappingrestkit.org/api/latest/Classes/…,我了解到,如果我使用 Core Data 烘焙映射,我会获得开箱即用的离线支持。所以如果我的用户打开飞行模式并启动[self.objectManager getObjectsAtPath:TRANSLATE_PATH parameters:queryParams success:<...> failure:<...> ];
      • 他仍然以某种方式得到结果。
      • 但是我可以假设它是不真实的,因为没有办法假设只知道请求路径从 Core Data 获取什么实体。
      • 所以我会尝试实施你的建议。
      【解决方案4】:

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

      • 您将 CoreData 与 RestKit(RKEntityMapping、托管对象等)一起使用
      • 您为实体提供了良好的标识属性。可以是来自@metadata的请求URL。
      • 在来自getObjectsAtPathsuccessfailure 回调上,您查询 CoreData 与获取请求并返回结果以相同的方式 就好像它已加载直接取自 mappingResult.firstObject 并将其标记为缓存如果它是旧结果加载失败

      【讨论】:

        猜你喜欢
        • 2021-08-11
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        相关资源
        最近更新 更多