ios - RestKit:初始映射后反向关系为空

标签 ios core-data restkit one-to-many entity-relationship

尝试通过单个响应连接来 self 的 API 的两个实体。

{
    "id": 4546,
    "body": "Direct message",
    "status": "received",
    "from": {
      "id": 723,
      "signature": "Mr. Whatever"
    },
    "sent_at": "2014-06-05T21:33:15Z",
    "sent_to": ...
  }

该对象是一个Message 实体,from 字段是一个嵌套的Sender 实体。下面是相关关系映射:

RKEntityMapping *senderMapping = [RKEntityMapping mappingForEntityForName:@"Sender"
                                                          inManagedObjectStore:[AMModelManager sharedManager].managedObjectStore];

    senderMapping.identificationAttributes = @[ @"remoteId" ];
    [senderMapping addAttributeMappingsFromDictionary:@{
                                                         @"id" : @"remoteId",
                                                         @"signature" : @"signature"
                                                         }];

    [messageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"from"
                                                                                   toKeyPath:@"sender"
                                                                                 withMapping:senderMapping]];

对象第一次映射时,关系还没有建立。我看到它被映射到日志中,但是当我打印任何特定的 Sender 对象时,它的 messages 反向关系显示一个空数组而不是关系错误。

Mapped relationship object from keyPath 'from' to 'sender'. Value: <Sender: 0x16a10990> (entity: Sender; id: 0x16a14580 <x-coredata:///Sender/t16539BDF-5606-442B-9EE2-D88363FB04AD29> ; data: {
    messages =     (
    );
    remoteId = 723;
    signature = "Mr. Whatever";
})

当我想搜索来自给定发件人的所有邮件时,这会使我在应用程序中的提取请求失败。

下次我运行应用程序并再次进行映射时,所有 MessageSender 实体都被重新映射,关系按预期连接,并且我的提取请求表现符合预期。

我真的不知道为什么这种关系在初始加载时无效。我不知道这是核心数据配置问题还是 RestKit 问题,但这让我发疯了,我希望能得到任何额外的见解。如有必要,很高兴提供更多信息。

编辑

这与建议的副本不同,因为这是一对一 关系,因此使用RKAssignmentPolicyUnion 的建议答案不适用。

更新

这是我正在为我正在收听的 Controller 使用的获取请求:

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Sender"];
    fetch.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF.messages, $message, $message.direct == %@).@count > 0 && SELF.remoteId != %@", @(YES), user.remoteId];
    fetch.sortDescriptors = @[
                              [NSSortDescriptor sortDescriptorWithKey:@"signature" ascending:YES selector:@selector(caseInsensitiveCompare:)]
                              ];

从语义上讲,我试图说“给我所有直接向当前用户发送消息的发件人,以及不是当前用户的所有发件人,按他们的签名排序。”

此获取请求获取我在检索数据后运行它时期望的 Sender 对象,但 Controller 未触发任何更新并且我的表保持为空,直到我下次运行该应用程序。

最佳答案

K,另一个经典案例“你做错了,你正在寻找所有错误的地方来修复它。”

我在我的 Message 实体的实现中覆盖了 didChangeValueForKey: 方法来监视一些 transient ,而忽略了调用 [super didChangeValueForKey:key],这使映射中的反向连接赋值变得困惑。 Core Data 或 RestKit 绝对没有问题。只是我粗心。

关于ios - RestKit:初始映射后反向关系为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24091986/

相关文章:

ios - iOS 上的 Nativescript 联系人权限

objective-c - 为什么我不能更新核心数据实体属性的 boolean 值?

ios - 将 NSDate 插入 CoreData 时出错

ios - SQLite 是否创建了一个我可以排序/获取的数字索引?

iOS:如何使用Restkit设置上传到服务器的图像的名称

ios - Apple FFT 给出不一致的结果

ios - 无法将参数传递给 UITableViewCell

objective-c - 如何调用 xxxxWithClass :(class) in swift

ios - RestKit 响应未正确映射

ios - NSTimer 与 NSUserDefaults