尝试从单个响应连接我的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";
})
当我想搜索来自给定发件人的所有邮件时,这使得我的应用程序中的获取请求失败。
下次运行应用程序并再次进行映射时,将重新映射所有Message
和Sender
个实体,关系按预期连接,并且我的提取请求按预期运行。
我真的不知道为什么这段关系在初始加载时没有效果。我不知道它是核心数据配置问题还是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对象,但是控制器不会触发更新,我的表将保持为空,直到下次运行应用程序为止。
答案 0 :(得分:2)
K,另一个经典案例“你做错了,你正在寻找所有错误的地方来解决它。”
我在didChangeValueForKey:
实体的实现上覆盖了Message
方法来监视某些瞬态,并忽略了调用[super didChangeValueForKey:key]
,这会映射映射中的反向连接分配。绝对没有Core Data或RestKit的问题。只是我粗心。