RestKit使用指定的主键引用在默认关系中映射对象

时间:2012-07-13 14:48:46

标签: mapping restkit

我目前正在开发iOS Messenger应用程序,我想谈谈这两个类关系:MessengerConversationMessengerMessage

假设我已经有一个本地MessengerConversation实例,它可以将许多MessengerMessage实例与其messages关系属性相关联,我想请求并映射以下JSON有效负载:

请求:GET / conversations /:conversationID / msgs
响应:

{
  "messages": [
    {
      ...
      "messageid": n,
      "content": "..."
      ...
    },
    ...
  ]
}

由于响应JSON有效负载未指示传递的消息来自哪个对话。我使用以下方法将此问题修复到我的MessengerManager类(负责与共享RKObjectManager实例交互):

- (void)objectLoader:(RKObjectLoader *)objectLoader willMapData:(inout id *)mappableData {
    //
    // GETs Resource Paths.
    if ([objectLoader method] == RKRequestMethodGET) {

        if ([pathMatcherConversationsMessagesGET matchesPath:objectLoader.resourcePath tokenizeQueryStrings:NO parsedArguments:Nil]) {
            //
            // Get requested conversationID from the following resource path Pattern:
            // kMessengerManagerResourcePathMessages: /conversations/:conversationID/msgs
            NSNumber *currentConversationID = Nil;
            NSDictionary *arguments = Nil;

            BOOL isMatchingPattern = [pathMatcherConversationsMessagesGET matchesPattern:kMessengerManagerResourcePathConversationsMessagesGET 
                                                                    tokenizeQueryStrings:YES 
                                                                         parsedArguments:&arguments];

            if (isMatchingPattern) {
                currentConversationID = [arguments objectForKey:@"conversationID"];
                //
                // Get the original returned array of messages:
                NSArray *origMessagesArray = [*mappableData valueForKeyPath:@"messages"];
                NSMutableArray *reformattedData = [NSMutableArray arrayWithCapacity:[origMessagesArray count]];
                //
                // Create copies of objects adding the already knew reference.
                for (NSDictionary *origMessagesArrayObject in origMessagesArray) {
                    NSMutableDictionary *newMessagesArrayObject = [origMessagesArrayObject mutableCopy];
                    [newMessagesArrayObject setObject:currentConversationID forKey:@"conversationid"];
                    [reformattedData addObject:newMessagesArrayObject];
                }
                //
                // Replace the new objects instead of the response objects
                [*mappableData setObject:reformattedData forKey:@"messages"];
            }
        }
    }    
}

所以一切正常。也就是说,所有从指定的MessengerConversation(进入RKObjectLoader资源路径)加载的MessengerMessage都被插入到所需关系中。

现在出现了真正的问题,因为我正在使用采用RKObjectLoaderProtocol的MessengerManager类,我可以实现objectLoader:willMapData:方法。但是由于我的View类使用RKFetchedResultsTableController并且每个表控制器实例也是它的RKObjectLoader委托,我不知道在映射操作之前启用RKFetchedResultsTableController实例来更新接收到的JSON有效负载的最佳做法

我可以继承它吗?

是否有更好的方法将接收到的对象映射到由RKObjectLoader资源路径指定的预定义对象(例如:GET / conversations / 2 / msg,其中所有生成的消息应该使用其主键映射到定义的MessengerConversation对象内值等于2)?

最好的问候,
皮瓦

1 个答案:

答案 0 :(得分:4)

您不需要此方法。启动RKObjectLoader时,将Conversation对象设置为targetObject,并进行相对于此对象的映射。例如:

RKManagedObjectMapping* cMapping = [RKManagedObjectMapping mappingForClass: [MessengerConversation class]];
RKManagedObjectMapping* mMapping = [RKManagedObjectMapping mappingForClass: [MessengerMessage class]];

//Configure mappings

[cMapping mapKeyPath: @"messages" toRelationship: @"messages" withObjectMapping: mMapping];

[mappingProvider setMapping cMapping forKeyPath: @""];