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

时间:2014-06-06 23:20:37

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

尝试从单个响应连接我的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问题,但它让我发疯,我希望能有更多的见解。很高兴在必要时提供更多信息。

修改

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

更新

以下是我用于控制器的抓取请求我正在收听:

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:)]
                              ];

在语义上我试图说&#34;给我所有发送消息的发件人直接发送给当前用户,并且不是当前用户,按他们的签名排序。&#34; < / p>

这个获取请求在我检索到数据后运行它时会获取我期望的Sender对象,但是控制器不会触发更新,我的表将保持为空,直到下次运行应用程序为止。

1 个答案:

答案 0 :(得分:2)

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

我在didChangeValueForKey:实体的实现上覆盖了Message方法来监视某些瞬态,并忽略了调用[super didChangeValueForKey:key],这会映射映射中的反向连接分配。绝对没有Core Data或RestKit的问题。只是我粗心。