7

我正在使用 RestKit 解析 JSON 并将其映射到 Core Data NSManagedObjects。这是一个示例 JSON。

{
    "events": [
        {
            "description": "...",
            "subject_type": "photo",
            "subject": {
                "id": 1,
                "thumb_url": "...",
                "medium_url": "...",
                "large_url": "..."
            }
        },
        {
            "description": "...",
            "subject_type": "user",
            "subject": {
                "id": 1,
                "username": "...",
                "followers": "..."
            }
        }
    ]
}

使用RKObjectMappingProvider并且RKManagedObjectMapping我将"events"数组映射到单独的核心数据Event对象中。这工作正常。

现在有Event两个关系。现在我需要根据 的值将主题数组映射到正确的 Core Data 对象,并将其设置为.UserPhoto"subject_type"Event

我尝试使用RKDynamicObjectMapping,但我不知道如何为“动态关系”指定它。我需要一些方法来根据 的值设置目标关系的名称subject_type

有什么想法吗?

4

3 回答 3

1

在 RestKit 中, RKDynamicMapping还允许使用指定的块来执行更复杂的动态映射操作,就像您描述的那样。提供此功能的特定方法称为setObjectMappingForRepresentationBlock

以下是有关该方法的一些文档: http ://restkit.org/api/latest/Classes/RKDynamicMapping.html#//api/name/setObjectMappingForRepresentationBlock :

RestKit 单元测试说明了此方法的一些简单案例。

于 2013-06-07T17:01:16.230 回答
0

看来您应该能够使用RKDynamicObjectMapping(请参阅对象映射)。您可以创建用户映射和照片映射,然后RKDynamicObjectMapping像这样使用:

[dynamicMapping setObjectMapping:userMapping 
              whenValueOfKeyPath:@"subject_type" 
                       isEqualTo:@"user"];
[dynamicMapping setObjectMapping:photoMapping 
              whenValueOfKeyPath:@"subject_type" 
                       isEqualTo:@"photo"];
于 2012-11-04T14:19:00.403 回答
0

我最近遇到了这个问题。通过 RestKit 跟踪,看起来它正在尝试将所有对象映射应用于 RKDynamicMapping 实例中的所有关系。参见applyRelationshipMappingsRKMappingOperation.m

我想出了一个 hack 解决方案,但不需要我大量修改 restkit 代码。

在 RKMappingOperation.m 中,我修改了以下方法:

destinationObjectForMappingRepresentation:parentRepresentation:withMapping:inRelationship:

我添加了以下代码(从注释开始)检查关系的目标是否与正在应用的对象类型相同,并且仅在匹配时继续。(这没有经过严格的测试,但在我的特定用例中有效。)

- (id)destinationObjectForMappingRepresentation:(id)representation parentRepresentation:(id)parentRepresentation withMapping:(RKMapping *)mapping inRelationship:(RKRelationshipMapping *)relationshipMapping
{
    RKObjectMapping *concreteMapping = nil;
    if ([mapping isKindOfClass:[RKDynamicMapping class]]) {
        concreteMapping = [(RKDynamicMapping *)mapping objectMappingForRepresentation:representation];
        if (! concreteMapping) {
            RKLogDebug(@"Unable to determine concrete object mapping from dynamic mapping %@ with which to map object representation: %@", mapping, representation);
            return nil;
        }
        // Make sure the destination of a core data relationship is the right entity class for the object we're mapping;
        if ([self.destinationObject respondsToSelector:@selector(managedObjectContext)])
        {
            NSEntityDescription *destinationEntity = [self.destinationObject entity];
            NSDictionary *destinationPropertiesDictionary = [destinationEntity propertiesByName];
            NSRelationshipDescription *destinationPropertyForDestinationKeyPath = [destinationPropertiesDictionary valueForKey:relationshipMapping.destinationKeyPath];
            NSString *relationshipDestinationClassName = [[destinationPropertyForDestinationKeyPath destinationEntity] name];
            NSString *mappedObjectClassName = [NSString stringWithCString:class_getName(concreteMapping.objectClass) encoding:NSUTF8StringEncoding];
            if (![relationshipDestinationClassName isEqualToString:mappedObjectClassName])
            {
                return nil;
            }
        }

...

于 2015-08-20T05:34:07.893 回答